diff options
| -rw-r--r-- | api-docs/cppdocs/Doxyfile | 9 | ||||
| -rw-r--r-- | api-docs/cppdocs/DoxygenLayout.xml | 10 | ||||
| -rw-r--r-- | api-docs/cppdocs/README.md | 2 | ||||
| -rw-r--r-- | api-docs/cppdocs/custom.css | 87 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/LICENSE | 21 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/README.md | 4 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js | 157 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js | 85 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js | 51 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css | 40 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css | 113 | ||||
| -rw-r--r-- | api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css | 2135 | ||||
| -rw-r--r-- | api-docs/cppdocs/header.html | 61 | ||||
| -rw-r--r-- | api-docs/cppdocs/style.css | 2021 | ||||
| -rw-r--r-- | binaryninjaapi.h | 1388 | ||||
| -rw-r--r-- | python/binaryview.py | 25 | ||||
| -rw-r--r-- | python/filemetadata.py | 5 | ||||
| -rw-r--r-- | python/types.py | 1 |
18 files changed, 4163 insertions, 2052 deletions
diff --git a/api-docs/cppdocs/Doxyfile b/api-docs/cppdocs/Doxyfile index f7cb9b6e..c2cd6428 100644 --- a/api-docs/cppdocs/Doxyfile +++ b/api-docs/cppdocs/Doxyfile @@ -1165,7 +1165,7 @@ HTML_FOOTER = footer.html # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = style.css +HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets @@ -1178,7 +1178,10 @@ HTML_STYLESHEET = style.css # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css \ + doxygen-awesome-css/doxygen-awesome-sidebar-only.css \ + doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css \ + custom.css # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1188,7 +1191,7 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to diff --git a/api-docs/cppdocs/DoxygenLayout.xml b/api-docs/cppdocs/DoxygenLayout.xml index 06fa867d..f946e233 100644 --- a/api-docs/cppdocs/DoxygenLayout.xml +++ b/api-docs/cppdocs/DoxygenLayout.xml @@ -2,13 +2,10 @@ <!-- Generated by doxygen 1.8.20 --> <!-- Navigation index tabs for HTML output --> <navindex> - <tab type="mainpage" visible="yes" title=""/> - <tab type="pages" visible="yes" title="" intro=""/> + <tab type="mainpage" visible="no" title="Binary Ninja API"/> + <tab type="pages" visible="yes" title="Binary Ninja API" intro=""/> <tab type="modules" visible="yes" title="" intro=""/> - <tab type="namespaces" visible="yes" title=""> - <tab type="namespacelist" visible="yes" title="" intro=""/> - <tab type="namespacemembers" visible="yes" title="" intro=""/> - </tab> + <tab type="namespacelist" visible="yes" title="Namespaces" intro=""/> <tab type="interfaces" visible="yes" title=""> <tab type="interfacelist" visible="yes" title="" intro=""/> <tab type="interfaceindex" visible="$ALPHABETICAL_INDEX" title=""/> @@ -24,7 +21,6 @@ <tab type="exceptionindex" visible="$ALPHABETICAL_INDEX" title=""/> <tab type="exceptionhierarchy" visible="yes" title="" intro=""/> </tab> - <tab type="filelist" visible="yes" title="Files"/> <tab type="examples" visible="yes" title="" intro=""/> </navindex> diff --git a/api-docs/cppdocs/README.md b/api-docs/cppdocs/README.md index 237a840c..9a857d17 100644 --- a/api-docs/cppdocs/README.md +++ b/api-docs/cppdocs/README.md @@ -1,6 +1,6 @@ # CPP Docs -We are currently expirmenting with two different document generation systems. You'll see artifacts for both of them in this directory. Currently, the documentation available [online](https://api.binary.ninja/cpp) uses [Doxygen](https://www.doxygen.nl/index.html) but we plan eventually to move to [Breathe](https://breathe.readthedocs.io/en/latest/) / [Sphinx](https://www.sphinx-doc.org/en/master/). +We are currently experimenting with two different document generation systems. You'll see artifacts for both of them in this directory. Currently, the documentation available [online](https://api.binary.ninja/cpp) uses [Doxygen](https://www.doxygen.nl/index.html) but we plan eventually to move to [Breathe](https://breathe.readthedocs.io/en/latest/) / [Sphinx](https://www.sphinx-doc.org/en/master/). ## Doxygen diff --git a/api-docs/cppdocs/custom.css b/api-docs/cppdocs/custom.css new file mode 100644 index 00000000..e977a5b7 --- /dev/null +++ b/api-docs/cppdocs/custom.css @@ -0,0 +1,87 @@ + +/* external link icon */ +div.contents a[href ^= "http"]:after { + content: " " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=); +} + +.githublogo { + content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RERCMUIwOUY4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RERCMUIwOUU4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1MTc4QTJBOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1MTc4QTJCOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jUqS1wAAApVJREFUeNq0l89rE1EQx3e3gVJoSPzZeNEWPKgHoa0HBak0iHiy/4C3WvDmoZ56qJ7txVsPQu8qlqqHIhRKJZceesmhioQEfxTEtsoSpdJg1u/ABJ7Pmc1m8zLwgWTmzcw3L+/te+tHUeQltONgCkyCi2AEDHLsJ6iBMlgHL8FeoqokoA2j4CloRMmtwTmj7erHBXPgCWhG6a3JNXKdCiDl1cidVbXZkJoXQRi5t5BrxwoY71FzU8S4JuAIqFkJ2+BFSlEh525b/hr3+k/AklDkNsf6wTT4yv46KIMNpsy+iMdMc47HNWxbsgVcUn7FmLAzzoFAWDsBx+wVP6bUpp5ewI+DOeUx0Wd9D8F70BTGNjkWtqnhmT1JQAHcUgZd8Lo3rQb1LAT8eJVUfgGvHQigGp+V2Z0iAUUl8QH47kAA1XioxIo+bRN8OG8F/oBjwv+Z1nJgX5jpdzQDw0LCjsPmrcW7I/iHScCAEDj03FtD8A0EyuChHgg4KTlJQF3wZ7WELppnBX+dBFSVpJsOBWi1qiRgSwnOgoyD5hmuJdkWCVhTgnTvW3AgYIFrSbZGh0UW/Io5Vp+DQoK7o80pztWMemZbgxeNwCNwDbw1fIfgGZjhU6xPaJgBV8BdsMw5cbZoHsenwYFxkZzl83xTSKTiviCAfCsJLysH3POfC8m8NegyGAGfLP/VmGmfSChgXroR0RSWjEFv2J/nG84cuKFMf4sTCZqXuJd4KaXFVjEG3+tw4eXbNK/YC9oXXs3O8NY8y99L4BXY5cvLY/Bb2VZ58EOJVcB18DHJq9lRsKr8inyKGVjlmh29mtHs3AHfuhCwy1vXT/Nu2GKQt+UHsGdctyX6eQyNvc+5sfX9Dl7Pe2J/BRgAl2CpwmrsHR0AAAAASUVORK5CYII=); +} + +/* search bar wrapper */ +#titlearea #projectalign + td { + position: absolute; + left: 20px; + top: 80px; +} + +doxygen-awesome-dark-mode-toggle { + display: inline-block !important; + position: absolute; + right: -27px; + top: 0px; + padding-top: 5px; + height: 29px; +} +/* +Doxygen by default does this horrible table layout thing where it tries to figure the default width of the left + column by taking the largest item in that column (the type), unwrapped, and making that the width for the entire column +We are working with C++, type declarations can be massive. So lock it to 350px and turn on word wrapping for the Types + column. +*/ +table.memberdecls .memItemLeft { + white-space: normal; + min-width: 350px; +} + +html.dark-mode { + --primary-color: #c74433!important; + --primary-dark-color: #d0584d !important;; + --primary-light-color: #a2382a !important;; +} +html { + --primary-color: #c74433!important; + --primary-dark-color: #d0584d !important;; + --primary-light-color: #a2382a !important;; + --side-nav-background: #252628 !important; + --side-nav-foreground: #ffffff !important; +} + +div#projectname { + color: white; +} +.paramname { + color: var(--primary-light-color); +} +.paramtype .el { + color: var(--primary-dark-color) !important; +} + +tr#projectrow { + margin-top: 7px; + display: block; +} + +#MSearchBox span.left { + left: 5px; + top: 1px; +} + +input#MSearchField { + padding-left: 10px; + top: -1px; +} + +/* Basic Mobile functionality fixes */ +@media screen and (max-width: 767px) { + div#top { + height: 125px; + } + div#MSearchBox { + top: -16px; + } + doxygen-awesome-dark-mode-toggle { + padding-top: 0px; + right: -22px; + } +}
\ No newline at end of file diff --git a/api-docs/cppdocs/doxygen-awesome-css/LICENSE b/api-docs/cppdocs/doxygen-awesome-css/LICENSE new file mode 100644 index 00000000..1d8b99a9 --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/api-docs/cppdocs/doxygen-awesome-css/README.md b/api-docs/cppdocs/doxygen-awesome-css/README.md new file mode 100644 index 00000000..b823a109 --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/README.md @@ -0,0 +1,4 @@ +This doxygen theme is from https://github.com/jothepro/doxygen-awesome-css + +Do not edit any of the files in this directory unless *absolutely necessary*; instead edit ../custom.css . + diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js new file mode 100644 index 00000000..f2c5853f --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js @@ -0,0 +1,157 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeDarkModeToggle extends HTMLElement { + // SVG icons from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>` + static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>` + static title = "Toggle Light/Dark Mode" + + static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode" + static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode" + + static _staticConstructor = function() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference) + // Update the color scheme when the browsers preference changes + // without user interaction on the website. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + }) + // Update the color scheme when the tab is made visible again. + // It is possible that the appearance was changed in another tab + // while this tab was in the background. + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged() + } + }); + }() + + static init() { + $(function() { + $(document).ready(function() { + const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle') + toggleButton.title = DoxygenAwesomeDarkModeToggle.title + toggleButton.updateIcon() + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + toggleButton.updateIcon() + }) + document.addEventListener("visibilitychange", visibilityState => { + if (document.visibilityState === 'visible') { + toggleButton.updateIcon() + } + }); + + $(document).ready(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + $(window).resize(function(){ + document.getElementById("MSearchBox").parentNode.appendChild(toggleButton) + }) + }) + }) + } + + constructor() { + super(); + this.onclick=this.toggleDarkMode + } + + /** + * @returns `true` for dark-mode, `false` for light-mode system preference + */ + static get systemPreference() { + return window.matchMedia('(prefers-color-scheme: dark)').matches + } + + /** + * @returns `true` for dark-mode, `false` for light-mode user preference + */ + static get userPreference() { + return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) || + (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)) + } + + static set userPreference(userPreference) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference + if(!userPreference) { + if(DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey) + } + } else { + if(!DoxygenAwesomeDarkModeToggle.systemPreference) { + localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true) + } else { + localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey) + } + } + DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged() + } + + static enableDarkMode(enable) { + if(enable) { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = true + document.documentElement.classList.add("dark-mode") + document.documentElement.classList.remove("light-mode") + } else { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = false + document.documentElement.classList.remove("dark-mode") + document.documentElement.classList.add("light-mode") + } + } + + static onSystemPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + static onUserPreferenceChanged() { + DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled) + } + + toggleDarkMode() { + DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference + this.updateIcon() + } + + updateIcon() { + if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) { + this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon + } else { + this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon + } + } +} + +customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle); diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js new file mode 100644 index 00000000..7d06b348 --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js @@ -0,0 +1,85 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeFragmentCopyButton extends HTMLElement { + constructor() { + super(); + this.onclick=this.copyContent + } + static title = "Copy to clipboard" + static copyIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>` + static successIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z"/></svg>` + static successDuration = 980 + static init() { + $(function() { + $(document).ready(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const fragmentWrapper = document.createElement("div") + fragmentWrapper.className = "doxygen-awesome-fragment-wrapper" + const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button") + fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title + + fragment.parentNode.replaceChild(fragmentWrapper, fragment) + fragmentWrapper.appendChild(fragment) + fragmentWrapper.appendChild(fragmentCopyButton) + + } + } + }) + }) + } + + + copyContent() { + const content = this.previousSibling.cloneNode(true) + // filter out line number from file listings + content.querySelectorAll(".lineno, .ttc").forEach((node) => { + node.remove() + }) + let textContent = content.textContent + // remove trailing newlines that appear in file listings + let numberOfTrailingNewlines = 0 + while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') { + numberOfTrailingNewlines++; + } + textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines) + navigator.clipboard.writeText(textContent); + this.classList.add("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon + window.setTimeout(() => { + this.classList.remove("success") + this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon + }, DoxygenAwesomeFragmentCopyButton.successDuration); + } +} + +customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton) diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js new file mode 100644 index 00000000..6424dbd4 --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js @@ -0,0 +1,51 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +class DoxygenAwesomeParagraphLink { + // Icon from https://fonts.google.com/icons + // Licensed under the Apache 2.0 license: + // https://www.apache.org/licenses/LICENSE-2.0.html + static icon = `<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z"/></svg>` + static title = "Permanent Link" + static init() { + $(function() { + $(document).ready(function() { + document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => { + let anchorlink = document.createElement("a") + anchorlink.setAttribute("href", `#${node.getAttribute("id")}`) + anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title) + anchorlink.classList.add("anchorlink") + node.classList.add("anchor") + anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon + node.parentElement.appendChild(anchorlink) + }) + }) + }) + } +} diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css new file mode 100644 index 00000000..b988b6f0 --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css @@ -0,0 +1,40 @@ + +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +@media screen and (min-width: 768px) { + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height)); + } +} diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css new file mode 100644 index 00000000..b5c4e7cb --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css @@ -0,0 +1,113 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + */ + +html { + /* side nav width. MUST be = `TREEVIEW_WIDTH`. + * Make sure it is wide enough to contain the page title (logo + title + version) + */ + --side-nav-fixed-width: 335px; + --menu-display: none; + + --top-height: 120px; +} + +#projectname { + white-space: nowrap; +} + + +@media screen and (min-width: 768px) { + html { + --searchbar-background: var(--page-background-color); + } + + #side-nav { + min-width: var(--side-nav-fixed-width); + max-width: var(--side-nav-fixed-width); + top: var(--top-height); + overflow: visible; + } + + #nav-tree, #side-nav { + height: calc(100vh - var(--top-height)) !important; + } + + #nav-tree { + padding: 0; + } + + #top { + display: block; + border-bottom: none; + height: var(--top-height); + margin-bottom: calc(0px - var(--top-height)); + max-width: var(--side-nav-fixed-width); + overflow: hidden; + background: var(--side-nav-background); + } + #main-nav { + float: left; + padding-right: 0; + } + + .ui-resizable-handle { + cursor: default; + width: 1px !important; + box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color); + } + + #nav-path { + position: fixed; + right: 0; + left: var(--side-nav-fixed-width); + bottom: 0; + width: auto; + } + + #doc-content { + height: calc(100vh - 31px) !important; + padding-bottom: calc(3 * var(--spacing-large)); + padding-top: calc(var(--top-height) - 80px); + box-sizing: border-box; + margin-left: var(--side-nav-fixed-width) !important; + } + + #MSearchBox { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium))); + } + + #MSearchField { + width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px); + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: auto; + } +} diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css new file mode 100644 index 00000000..5f420dc4 --- /dev/null +++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css @@ -0,0 +1,2135 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: white; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #637485; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most compontest reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, Searchresult, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1000px; + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #f8d1cc; + --warning-color-dark: #b61825; + --warning-color-darker: #75070f; + --note-color: #faf3d8; + --note-color-dark: #f3a600; + --note-color-darker: #5f4204; + --todo-color: #e4f3ff; + --todo-color-dark: #1879C4; + --todo-color-darker: #274a5c; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #e4dafd; + --bug-color-dark: #5b2bdd; + --bug-color-darker: #2a0d72; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsable table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, .sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, .SelectItem, #MSearchField, .navpath li.navelem a, .navpath li.navelem a:hover { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: .9em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl { + font-size: var(--page-font-size); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +.left #MSearchSelect { + left: 0; + user-select: none; +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +.left #MSearchSelect { + padding-left: 8px; +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + background: var(--separator-color); + width: 1px; +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 210%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe { + filter: hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 1500px 0 var(--page-background-color), + -1500px 0 var(--page-background-color), + 1500px 0.75px var(--separator-color), + -1500px 0.75px var(--separator-color), + 2000px 0 var(--page-background-color), + -2000px 0 var(--page-background-color), + 2000px 0.75px var(--separator-color), + -2000px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); +} + +.glow { + text-shadow: 0 0 15px var(--primary-light-color) !important; +} + +.alphachar a { + color: var(--page-foreground-color); +} + +/* + Table of Contents + */ + +div.toc { + z-index: 10; + position: relative; + background-color: var(--toc-background); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + padding: 0 var(--spacing-large); + margin: 0 0 var(--spacing-medium) var(--spacing-medium); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0; +} + +div.toc li { + font-size: var(--navigation-font-size); + padding: 0; + background: none; +} + +div.toc li:before { + content: '↓'; + font-weight: 800; + font-family: var(--font-family); + margin-right: var(--spacing-small); + color: var(--toc-foreground); + opacity: .4; +} + +div.toc ul li.level1 { + margin: 0; +} + +div.toc ul li.level2, div.toc ul li.level3 { + margin-top: 0; +} + + +@media screen and (max-width: 767px) { + div.toc { + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; + word-break: break-word; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt { + color: var(--todo-color-dark); +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); + text-shadow: none; +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: inline-block; + max-width: 100%; + } + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.markdownTable, table.fieldtable { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.fieldtable { + width: 100%; +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, th.markdownTableHeadRight:first-child, th.markdownTableHeadCenter:first-child, th.markdownTableHeadNone:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, th.markdownTableHeadRight:last-child, th.markdownTableHeadCenter:last-child, th.markdownTableHeadNone:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, table.markdownTable th, table.fieldtable dt { + border: none; + border-right: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, table.markdownTable th:last-child, table.fieldtable dt:last-child { + border: none; +} + +table.markdownTable tr, table.markdownTable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.markdownTable tr:last-child { + border-bottom: none; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); + border-bottom: 1px solid var(--separator-color); +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--separator-color); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: 0 0 15px var(--primary-light-color); +} + +table.memberdecls { + display: block; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: 0; +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + line-height: 1.5em; + color: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-top: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry { + padding: var(--spacing-small); +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + width: 18px; + height: 18px; + line-height: 18px; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar { + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform .1s ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity .1s ease-in-out, color .1s ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} diff --git a/api-docs/cppdocs/header.html b/api-docs/cppdocs/header.html index f78cbfcc..7d2534eb 100644 --- a/api-docs/cppdocs/header.html +++ b/api-docs/cppdocs/header.html @@ -1,13 +1,19 @@ -<!-- HTML header for doxygen 1.8.7--> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<!-- HTML header for doxygen 1.9.4--> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> -<meta http-equiv="X-UA-Compatible" content="IE=9"/> +<meta http-equiv="X-UA-Compatible" content="IE=11"/> <meta name="generator" content="Doxygen $doxygenversion"/> -<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME--> -<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME--> +<meta name="viewport" content="width=device-width, initial-scale=1"/> +<!--BEGIN PROJECT_NAME--><title>BinaryNinja C++ API: $title</title><!--END PROJECT_NAME--> +<!--BEGIN !PROJECT_NAME--><title>BinaryNinja C++ API</title><!--END !PROJECT_NAME--> <link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/> +<!--BEGIN DISABLE_INDEX--> + <!--BEGIN FULL_SIDEBAR--> +<script type="text/javascript">var page_layout=1;</script> + <!--END FULL_SIDEBAR--> +<!--END DISABLE_INDEX--> <script type="text/javascript" src="$relpath^jquery.js"></script> <script type="text/javascript" src="$relpath^dynsections.js"></script> $treeview @@ -15,10 +21,51 @@ $search $mathjax <link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" /> $extrastylesheet +<script type="text/javascript" src="$relpath^doxygen-awesome-darkmode-toggle.js"></script> +<script type="text/javascript"> + DoxygenAwesomeDarkModeToggle.init() +</script> </head> <body> +<!--BEGIN DISABLE_INDEX--> + <!--BEGIN FULL_SIDEBAR--> +<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! --> + <!--END FULL_SIDEBAR--> +<!--END DISABLE_INDEX--> + <div id="top"><!-- do not remove this div, it is closed by doxygen! --> -<div id="topbanner"><a href="https://github.com/Vector35/binaryninja-api"><i class="githublogo"></i></a></div> -$searchbox + +<!--BEGIN TITLEAREA--> +<div id="titlearea"> +<table cellspacing="0" cellpadding="0"> + <tbody> + <tr id="projectrow"> + <!--BEGIN PROJECT_LOGO--> + <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td> + <!--END PROJECT_LOGO--> + <!--BEGIN PROJECT_NAME--> + <td id="projectalign"> + <div id="projectname">Binary Ninja C++ API<!--BEGIN PROJECT_NUMBER--><span id="projectnumber"> $projectnumber</span><!--END PROJECT_NUMBER--> + </div> + </td> + <!--END PROJECT_NAME--> + <!--BEGIN !PROJECT_NAME--> + <!--END !PROJECT_NAME--> + <!--BEGIN DISABLE_INDEX--> + <!--BEGIN SEARCHENGINE--> + <!--BEGIN !FULL_SIDEBAR--> + <td>$searchbox</td> + <!--END !FULL_SIDEBAR--> + <!--END SEARCHENGINE--> + <!--END DISABLE_INDEX--> + </tr> + <!--BEGIN SEARCHENGINE--> + <!--BEGIN FULL_SIDEBAR--> + <tr><td colspan="2">$searchbox</td></tr> + <!--END FULL_SIDEBAR--> + <!--END SEARCHENGINE--> + </tbody> +</table> +</div> <!--END TITLEAREA--> <!-- end header part --> diff --git a/api-docs/cppdocs/style.css b/api-docs/cppdocs/style.css deleted file mode 100644 index 938592f1..00000000 --- a/api-docs/cppdocs/style.css +++ /dev/null @@ -1,2021 +0,0 @@ -/* The standard CSS for doxygen 1.8.20 */ -a { - color: #d73726; -} - -a:visited { - color: #6b1b13; -} - - -.highlighted { - background: none !important; -} - -a.highlighted { - background: none !important; -} - -#nav-tree { - background: #343131; -} - -#nav-tree .selected { - background-image: none; - background: #c9c9c9; - color: black !important; -} - -#nav-tree .selected a { - color: black !important; -} - -#nav-tree a { - color: #d9d9d9; -} - - -.glow { - background-color: #d73726 !important; - box-shadow: 0 0 15px #d73726 !important; -} - -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 #8A8A8A; - color: #343434; - 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.qindex, div.navtab{ - background-color: #EAEAEA; - border: 1px solid #A3A3A3; - text-align: center; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #d73726; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #d73726; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9C9C9C; - color: #FFFFFF; - border: 1px double #898989; -} - -.contents a.qindexHL:visited { - color: #FFFFFF; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code, a.code:visited, a.line, a.line:visited { - color: #4E4E4E; -} - -a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4E4E4E; -} - -/* @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 #C3C3C3; - background-color: #FBFBFB; - 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: #FBFBFB; - border: 1px solid #C3C3C3; -} - -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; -} - -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: #EAEAEA; - font-weight: bold; - border: 1px solid #C3C3C3; - margin: 2px 0px 2px 0; - padding: 2px 10px; - white-space: nowrap; - vertical-align: top; -} - -td.indexvalue { - background-color: #EAEAEA; - border: 1px solid #C3C3C3; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EDEDED; -} - -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: #F6F6F6; - border-left: 2px solid #9C9C9C; - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; -} - -blockquote.DocNodeRTL { - border-left: 0; - border-right: 2px solid #9C9C9C; - 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 #A3A3A3; -} - -th.dirtab { - background: #EAEAEA; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #545454; -} - -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: #F9F9F9; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memSeparator { - border-bottom: 1px solid #DCDCDC; - line-height: 1px; - margin: 0px; - padding: 0px; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memItemRight, .memTemplItemRight { - width: 100%; -} - -.memTemplParams { - color: #4E4E4E; - white-space: nowrap; - font-size: 80%; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtitle { - padding: 8px; - border-top: 1px solid #A7A7A7; - border-left: 1px solid #A7A7A7; - border-right: 1px solid #A7A7A7; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - margin-bottom: -1px; - background-color: #DDDDDD; - line-height: 1.25; - font-weight: 300; - float:left; -} - -.permalink { - font-size: 65%; - display: inline-block; - vertical-align: middle; -} - -.memtemplate { - font-size: 80%; - color: #4E4E4E; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EAEAEA; - border: 1px solid #A3A3A3; - 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 #A7A7A7; - border-left: 1px solid #A7A7A7; - border-right: 1px solid #A7A7A7; - padding: 6px 0px 6px 0px; - color: #1E1E1E; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-color: #DDDDDD; - /* 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 #A7A7A7; - border-left: 1px solid #A7A7A7; - border-right: 1px solid #A7A7A7; - padding: 6px 10px 2px 10px; - background-color: #FBFBFB; - border-top-width: 0; - 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: #804040; - 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: #777777; - border-top:1px solid #5F5F5F; - border-left:1px solid #5F5F5F; - border-right:1px solid #C3C3C3; - border-bottom:1px solid #C3C3C3; - 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 #9C9C9C; - border-bottom: 1px solid #9C9C9C; - 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: #F6F6F6; -} - -.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: #3F3F3F; -} - -.arrow { - color: #9C9C9C; - -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: #777777; - 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: #242424; -} - -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 #282828; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #363636; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -table.fieldtable { - /*width: 100%;*/ - margin-bottom: 10px; - border: 1px solid #A7A7A7; - 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 #A7A7A7; - border-bottom: 1px solid #A7A7A7; - vertical-align: top; -} - -.fieldtable td.fieldname { - padding-top: 3px; -} - -.fieldtable td.fielddoc { - border-bottom: 1px solid #A7A7A7; - /*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: #E1E1E1; - font-size: 90%; - color: #1E1E1E; - 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 #A7A7A7; -} - - -.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:#8C8C8C; - border:solid 1px #C0C0C0; - 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:#353535; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; - color: #222222; - 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:#6F6F6F; -} - -.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:#353535; - 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-color: #F9F9F9; - margin: 0px; - border-bottom: 1px solid #C3C3C3; -} - -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 #5F5F5F; -} - -.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 #919191; -} - -dl.citelist { - margin-bottom:50px; -} - -dl.citelist dt { - color:#303030; - 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: #F4F4F4; - border: 1px solid #D6D6D6; - 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: #4E4E4E; - 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; -} - -.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 #282828; - padding: 3px 7px 2px; -} - -table.markdownTable tr { -} - -th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: #363636; - 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; -} - - -a.el { - font-weight: normal; -} - -body, table, div, p, dl { - color: #333333; - font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-size: 15px; - font-style: normal; - font-variant: normal; - font-weight: normal; - line-height: 25.5px; -} - -body { - background-color: #fcfcfc; -} - -div.header { - background-image: none; - background-color: white; - margin: 0px; - border: 0px; -} - -div.headertitle { - width: 858px; - margin: 30px; - padding: 0px; -} - -div.toc { - background-color: #f8f8f8; - border-color: #ddd; - margin-right: 10px; - margin-left: 20px; -} -div.toc h3 { - color: #333333; - font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-size: 18px; - font-style: normal; - font-variant: normal; - font-weight: normal; -} -div.toc li { - color: #333333; - font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-size: 12px; - font-style: normal; - font-variant: normal; - font-weight: normal; -} - -.title { - font-size: 2.5em; - line-height: 63.75px; - border-bottom: 1px solid #ddd; - margin-bottom: 15px; - margin-left: 0px; - margin-right: 0px; - margin-top: 0px; -} - -.summary { - float: none !important; - width: auto !important; - padding-top: 10px; - padding-right: 10px !important; -} - -.summary + .headertitle .title { - font-size: 1.5em; - line-height: 2.0em; -} - -body h1 { - font-size: 2em; - line-height: 1.7; - border-bottom: 1px solid #eee; - margin: 1em 0 15px; - padding: 0; - overflow: hidden; -} - -body h2 { - font-size: 1.5em; - line-height: 1.7; - margin: 1em 0 15px; - padding: 0; -} - -pre.fragment { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 13px; - font-style: normal; - font-variant: normal; - font-weight: normal; - line-height: 19px; -} - -table.doxtable th { - background-color: #f8f8f8; - color: #333333; - font-size: 15px; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #ddd; -} - -#doc-content { - background-color: #fff; - width: 918px; - height: auto !important; - margin-left: 270px !important; -} - -div.contents { - width: 858px; - margin: 30px; -} - -div.line { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 13px; - font-style: normal; - font-variant: normal; - font-weight: normal; - line-height: 19px; -} - -tt, code, pre { - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; - font-size: 12px; -} - -div.fragment { - background-color: #f8f8f8; - border: 1px solid #ddd; - font-size: 13px; - line-height: 19px; - overflow: auto; - padding: 6px 10px; - border-radius: 3px; -} - -#topbanner { - position: fixed; - margin: 15px; - z-index: 101; -} - -#projectname -{ - font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-size: 38px; - font-weight: bold; - line-height: 63.75px; - margin: 0px; - padding: 2px 0px; -} - -#projectbrief -{ - font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-size: 16px; - line-height: 22.4px; - margin: 0px 0px 13px 0px; - padding: 2px; -} - -/* side bar and search */ - -#side-nav -{ - padding: 10px 0px 10px 10px; - border-top: 60px solid #d73726; - background-color: #343131; - width: 250px !important; - height: 100% !important; - position: fixed; -} - -#nav-tree -{ - background-color: transparent; - background-image: none; - height: 100% !important; -} - -#nav-tree .label -{ - font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'; - line-height: 25.5px; - font-size: 15px; -} - -#nav-tree -{ - color: #b3b3b3; -} - -#nav-tree .selected { - text-shadow: none; - background-image: none; -} - -#github -{ - position: fixed; - left: auto; - right: auto; - width: 250px; -} - -#MSearchBox -{ - margin: 20px; - left: 40px; - right: auto; - position: fixed; - width: 180px; -} - -#MSearchField -{ - width: 121px; -} - -#MSearchResultsWindow -{ - left: 45px !important; -} - -#nav-sync -{ - display: none; -} - -.ui-resizable .ui-resizable-handle -{ - width: 0px; -} - -#nav-path -{ - display: none; -} - -/* external link icon */ -div.contents a[href ^= "http"]:after { - content: " " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=); -} - -.githublogo { - content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RERCMUIwOUY4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RERCMUIwOUU4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1MTc4QTJBOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1MTc4QTJCOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jUqS1wAAApVJREFUeNq0l89rE1EQx3e3gVJoSPzZeNEWPKgHoa0HBak0iHiy/4C3WvDmoZ56qJ7txVsPQu8qlqqHIhRKJZceesmhioQEfxTEtsoSpdJg1u/ABJ7Pmc1m8zLwgWTmzcw3L+/te+tHUeQltONgCkyCi2AEDHLsJ6iBMlgHL8FeoqokoA2j4CloRMmtwTmj7erHBXPgCWhG6a3JNXKdCiDl1cidVbXZkJoXQRi5t5BrxwoY71FzU8S4JuAIqFkJ2+BFSlEh525b/hr3+k/AklDkNsf6wTT4yv46KIMNpsy+iMdMc47HNWxbsgVcUn7FmLAzzoFAWDsBx+wVP6bUpp5ewI+DOeUx0Wd9D8F70BTGNjkWtqnhmT1JQAHcUgZd8Lo3rQb1LAT8eJVUfgGvHQigGp+V2Z0iAUUl8QH47kAA1XioxIo+bRN8OG8F/oBjwv+Z1nJgX5jpdzQDw0LCjsPmrcW7I/iHScCAEDj03FtD8A0EyuChHgg4KTlJQF3wZ7WELppnBX+dBFSVpJsOBWi1qiRgSwnOgoyD5hmuJdkWCVhTgnTvW3AgYIFrSbZGh0UW/Io5Vp+DQoK7o80pztWMemZbgxeNwCNwDbw1fIfgGZjhU6xPaJgBV8BdsMw5cbZoHsenwYFxkZzl83xTSKTiviCAfCsJLysH3POfC8m8NegyGAGfLP/VmGmfSChgXroR0RSWjEFv2J/nG84cuKFMf4sTCZqXuJd4KaXFVjEG3+tw4eXbNK/YC9oXXs3O8NY8y99L4BXY5cvLY/Bb2VZ58EOJVcB18DHJq9lRsKr8inyKGVjlmh29mtHs3AHfuhCwy1vXT/Nu2GKQt+UHsGdctyX6eQyNvc+5sfX9Dl7Pe2J/BRgAl2CpwmrsHR0AAAAASUVORK5CYII=); -} diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 692c6901..5930faef 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -703,12 +703,57 @@ namespace BinaryNinja { */ Ref<BinaryView> OpenView(Ref<BinaryView> rawData, bool updateAnalysis = true, std::function<bool(size_t, size_t)> progress = {}, Json::Value options = Json::Value(Json::objectValue), bool isDatabase = false); + /*! + DemangleMS demangles a Microsoft Visual Studio C++ name + + \param arch Architecture for the symbol. Required for pointer and integer sizes. + \param mangledName a mangled Microsoft Visual Studio C++ name + \param outType Pointer to Type to output + \param outVarName QualifiedName reference to write the output name to. + \param simplify Whether to simplify demangled names. + */ bool DemangleMS(Architecture* arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName, const bool simplify = false); + + /*! + DemangleMS demangles a Microsoft Visual Studio C++ name + + This overload will use the view's "analysis.types.templateSimplifier" setting + to determine whether to simplify the mangled name. + + \param arch Architecture for the symbol. Required for pointer and integer sizes. + \param mangledName a mangled Microsoft Visual Studio C++ name + \param outType Pointer to Type to output + \param outVarName QualifiedName reference to write the output name to. + \param view View to check the analysis.types.templateSimplifier for + */ bool DemangleMS(Architecture* arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName, const Ref<BinaryView>& view); + + /*! + DemangleGNU3 demangles a GNU3 name + + \param arch Architecture for the symbol. Required for pointer and integer sizes. + \param mangledName a mangled GNU3 name + \param outType Pointer to Type to output + \param outVarName QualifiedName reference to write the output name to. + \param simplify Whether to simplify demangled names. + */ bool DemangleGNU3(Ref<Architecture> arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName, const bool simplify = false); + + /*! + DemangleGNU3 demangles a GNU3 name + + This overload will use the view's "analysis.types.templateSimplifier" setting + to determine whether to simplify the mangled name. + + \param arch Architecture for the symbol. Required for pointer and integer sizes. + \param mangledName a mangled GNU3 name + \param outType Pointer to Type to output + \param outVarName QualifiedName reference to write the output name to. + \param view View to check the analysis.types.templateSimplifier for + */ bool DemangleGNU3(Ref<Architecture> arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName, const Ref<BinaryView>& view); @@ -842,16 +887,36 @@ namespace BinaryNinja { bool ZlibDecompress(DataBuffer& output) const; }; + /*! + TemporaryFile is used for creating temporary files, stored (temporarily) in the system's default temporary file + directory. + */ class TemporaryFile : public CoreRefCountObject<BNTemporaryFile, BNNewTemporaryFileReference, BNFreeTemporaryFile> { public: TemporaryFile(); + + /*! Create a new temporary file with BinaryNinja::DataBuffer contents. + + \param contents DataBuffer with contents to write to the file. + */ TemporaryFile(const DataBuffer& contents); + + /*! Create a new temporary file with string contents. + + \param contents std::string with contents to write to the file. + */ TemporaryFile(const std::string& contents); TemporaryFile(BNTemporaryFile* file); bool IsValid() const { return m_object != nullptr; } + + /*! Path to the TemporaryFile on the filesystem. + */ std::string GetPath() const; + + /*! DataBuffer with contents of the file. + */ DataBuffer GetContents(); }; @@ -1023,32 +1088,121 @@ namespace BinaryNinja { FileMetadata(const std::string& filename); FileMetadata(BNFileMetadata* file); + /*! + Close the underlying file handle + */ void Close(); void SetNavigationHandler(NavigationHandler* handler); + /*! + \return The original name of the binary opened if a bndb, otherwise returns the current filename + */ std::string GetOriginalFilename() const; + + /*! + If the filename is not open in a BNDB, sets the filename for the current file. + + \param name New name + */ void SetOriginalFilename(const std::string& name); + /*! + \return The name of the open bndb or binary filename + */ std::string GetFilename() const; + + /*! + \param name Set the filename for the currnt BNDB or binary. + */ void SetFilename(const std::string& name); + /*! + \return Whether the file has unsaved modifications + */ bool IsModified() const; + + /*! + \return Whether auto-analysis results have changed. + */ bool IsAnalysisChanged() const; + + /*! + Mark file as having unsaved changes + */ void MarkFileModified(); + + /*! + Mark file as having been saved (inverse of MarkFileModified) + */ void MarkFileSaved(); bool IsSnapshotDataAppliedWithoutError() const; + /*! Whether the FileMetadata is backed by a database, or if specified, + a specific BinaryView type + + \param binaryViewType Type for the BinaryView + \return Whether the FileMetadata is backed by a database + */ bool IsBackedByDatabase(const std::string& binaryViewType = "") const; + + /*! Writes the current database (.bndb) out to the specified file. + + \param name path and filename to write the bndb to. Should have ".bndb" appended to it. + \param data BinaryView to save the database from + \param settings Special save options + \return Whether the save was successful + */ bool CreateDatabase(const std::string& name, BinaryView* data, Ref<SaveSettings> settings); + + /*! Writes the current database (.bndb) out to the specified file. + + \param name path and filename to write the bndb to. Should have ".bndb" appended to it. + \param data BinaryView to save the database from + \param progressCallback callback function to send save progress to. + \param settings Special save options + \return Whether the save was successful + */ bool CreateDatabase(const std::string& name, BinaryView* data, const std::function<bool(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings); + + /*! Open an existing database from a given path + + \param path Path to the existing database + \return The resulting BinaryView, if the load was successful + */ Ref<BinaryView> OpenExistingDatabase(const std::string& path); + + /*! Open an existing database from a given path with a progress callback + + \param path Path to the existing database + \param progressCallback callback function to send load progress to. + \return The resulting BinaryView, if the load was successful + */ Ref<BinaryView> OpenExistingDatabase( const std::string& path, const std::function<bool(size_t progress, size_t total)>& progressCallback); Ref<BinaryView> OpenDatabaseForConfiguration(const std::string& path); + + /*! Save the current database to the already created file. + + Note: CreateDatabase should have been called prior to calling this. + + \param data BinaryView to save the data of + \param settings Special save options + \return Whether the save was successful + */ bool SaveAutoSnapshot(BinaryView* data, Ref<SaveSettings> settings); + + /*! Save the current database to the already created file. + + Note: CreateDatabase should have been called prior to calling this. + + \param data BinaryView to save the data of + \param settings Special save options + \param progressCallback callback function to send save progress to + \return Whether the save was successful + */ bool SaveAutoSnapshot(BinaryView* data, const std::function<bool(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings); void GetSnapshotData( @@ -1058,7 +1212,21 @@ namespace BinaryNinja { bool restoreRawView = true); Ref<Database> GetDatabase(); + /*! Rebase the given BinaryView to a new address + + \param data BinaryView to rebase + \param address Address to rebase to + \return Whether the rebase was successful + */ bool Rebase(BinaryView* data, uint64_t address); + + /*! Rebase the given BinaryView to a new address + + \param data BinaryView to rebase + \param address Address to rebase to + \param progressCallback Callback function to pass rebase progress to + \return Whether the rebase was successful + */ bool Rebase(BinaryView* data, uint64_t address, const std::function<bool(size_t progress, size_t total)>& progressCallback); bool CreateSnapshotedView(BinaryView* data, const std::string& viewName); @@ -1068,12 +1236,28 @@ namespace BinaryNinja { MergeResult MergeUserAnalysis(const std::string& name, const std::function<bool(size_t, size_t)>& progress, const std::vector<std::string> excludedHashes = {}); + /*! Start recording actions taken so they can be undone at some point + */ void BeginUndoActions(); + + /*! Commit the actions taken since the last commit to the undo database. + */ void CommitUndoActions(); + /*! \return Whether it is possible to perform an Undo + */ bool CanUndo(); + + /*! Undo the last committed action in the undo database. + */ bool Undo(); + + /*! \return Whether it is possible to perform a Redo + */ bool CanRedo(); + + /*! Redo the last committed action in the undo database. + */ bool Redo(); std::vector<Ref<User>> GetUsers(); @@ -1087,12 +1271,47 @@ namespace BinaryNinja { void CloseProject(); bool IsProjectOpen(); + /*! + Get the current View name, e.g. ``Linear:ELF``, ``Graph:PE`` + + \return The current view name + */ std::string GetCurrentView(); + + /*! + Get the current offset in the current view + + \return The current offset + */ uint64_t GetCurrentOffset(); + + /*! + Navigate to the specified virtual address in the specified view + + \param view View name. e.g. ``Linear:ELF``, ``Graph:PE`` + \param offset Virtual address to navigate to + \return Whether the navigation was successful. + */ bool Navigate(const std::string& view, uint64_t offset); + /*! + Get the BinaryView for a specific View type + + \param name View name. e.g. ``Linear:ELF``, ``Graph:PE`` + \return The BinaryView, if it exists + */ BinaryNinja::Ref<BinaryNinja::BinaryView> GetViewOfType(const std::string& name); + + /*! + List of View names that exist within the current file + + \return List of View Names + */ std::vector<std::string> GetExistingViews() const; + + /*! + \return Current Session ID + */ size_t GetSessionId() const; }; @@ -1454,14 +1673,63 @@ namespace BinaryNinja { const NameSpace& nameSpace = NameSpace(DEFAULT_INTERNAL_NAMESPACE), uint64_t ordinal = 0); Symbol(BNSymbol* sym); + /*! + Symbols are defined as one of the following types: + + =========================== ============================================================== + BNSymbolType Description + =========================== ============================================================== + FunctionSymbol Symbol for function that exists in the current binary + ImportAddressSymbol Symbol defined in the Import Address Table + ImportedFunctionSymbol Symbol for a function that is not defined in the current binary + DataSymbol Symbol for data in the current binary + ImportedDataSymbol Symbol for data that is not defined in the current binary + ExternalSymbol Symbols for data and code that reside outside the BinaryView + LibraryFunctionSymbol Symbols for external functions outside the library + =========================== ============================================================== + + \return Symbol type + */ BNSymbolType GetType() const; + + /*! + \return Symbol binding + */ BNSymbolBinding GetBinding() const; + + /*! + \return Symbol short name + */ std::string GetShortName() const; + + /*! + \return Symbol full name + */ std::string GetFullName() const; + + /*! + \return Symbol raw name + */ std::string GetRawName() const; + + /*! + \return Symbol Address + */ uint64_t GetAddress() const; + + /*! + \return Symbol ordinal + */ uint64_t GetOrdinal() const; + + /*! + \return Whether the symbol was auto-defined + */ bool IsAutoDefined() const; + + /*! + \return Symbol NameSpace + */ NameSpace GetNameSpace() const; static Ref<Symbol> ImportedFunctionFromImportAddressSymbol(Symbol* sym, uint64_t addr); @@ -1677,15 +1945,62 @@ namespace BinaryNinja { TagType(BinaryView* view, const std::string& name, const std::string& icon, bool visible = true, Type type = UserTagType); + /*! + \return BinaryView for this TagType + */ BinaryView* GetView() const; + + /*! + \return Unique ID of the TagType + */ std::string GetId() const; + + /*! + \return Name of the TagType + */ std::string GetName() const; + + /*! + Set the name of the TagType + + \param name New name + */ void SetName(const std::string& name); + + /*! + \return Unicode string containing an emoji to be used as an icon + */ std::string GetIcon() const; + + /*! + Set the icon to be used for a TagType + + \param icon Unicode string containing an emoji to be used as an icon + */ void SetIcon(const std::string& icon); + + /*! + \return Whether the tags of this type are visible + */ bool GetVisible() const; + + /*! + Set whether the tags of this type are visible + + \param visible Whether the tags of this type are visible + */ void SetVisible(bool visible); + + /*! + One of: UserTagType, NotificationTagType, BookmarksTagType + + \return Tag Type. + */ Type GetType() const; + + /*! + \param type Tag Type. One of: UserTagType, NotificationTagType, BookmarksTagType + */ void SetType(Type type); }; @@ -1695,7 +2010,14 @@ namespace BinaryNinja { Tag(BNTag* tag); Tag(Ref<TagType> type, const std::string& data = ""); + /*! + \return Unique ID of the Tag + */ std::string GetId() const; + + /*! + \return TagType of this tag + */ Ref<TagType> GetType() const; std::string GetData() const; void SetData(const std::string& data); @@ -1821,6 +2143,14 @@ namespace BinaryNinja { (void)len; return 0; } + + /*! PerformWrite provides a mapping between the flat file and virtual offsets in the file. + + \param offset the virtual offset to find and write len bytes to + \param data the address to read len number of bytes from + \param len the number of bytes to read from data and write to offset + \return length of data written, 0 on error + */ virtual size_t PerformWrite(uint64_t offset, const void* data, size_t len) { (void)offset; @@ -1828,6 +2158,15 @@ namespace BinaryNinja { (void)len; return 0; } + + /*! PerformInsert provides a mapping between the flat file and virtual offsets in the file, + inserting `len` bytes from `data` to virtual address `offset` + + \param offset the virtual offset to find and insert len bytes into + \param data the address to read len number of bytes from + \param len the number of bytes to read from data and insert at offset + \return length of data inserted, 0 on error + */ virtual size_t PerformInsert(uint64_t offset, const void* data, size_t len) { (void)offset; @@ -1835,6 +2174,14 @@ namespace BinaryNinja { (void)len; return 0; } + + /*! PerformRemove provides a mapping between the flat file and virtual offsets in the file, + removing `len` bytes from virtual address `offset` + + \param offset the virtual offset to find and remove bytes from + \param len the number of bytes to be removed + \return length of data removed, 0 on error + */ virtual size_t PerformRemove(uint64_t offset, uint64_t len) { (void)offset; @@ -1842,23 +2189,89 @@ namespace BinaryNinja { return 0; } + /*! PerformGetModification implements a query as to whether the virtual address `offset` is modified. + + \param offset a virtual address to be checked + \return one of Original, Changed, Inserted + */ virtual BNModificationStatus PerformGetModification(uint64_t offset) { (void)offset; return Original; } + + /*! PerformIsValidOffset implements a check as to whether a virtual address `offset` is valid + + \param offset the virtual address to check + \return whether the offset is valid + */ virtual bool PerformIsValidOffset(uint64_t offset); + + /*! PerformIsOffsetReadable implements a check as to whether a virtual address is readable + + \param offset the virtual address to check + \return whether the offset is readable + */ virtual bool PerformIsOffsetReadable(uint64_t offset); + + /*! PerformIsOffsetWritable implements a check as to whether a virtual address is writable + + \param offset the virtual address to check + \return whether the offset is writable + */ virtual bool PerformIsOffsetWritable(uint64_t offset); + + /*! PerformIsOffsetExecutable implements a check as to whether a virtual address is executable + + \param offset the virtual address to check + \return whether the offset is executable + */ virtual bool PerformIsOffsetExecutable(uint64_t offset); + + /*! PerformIsOffsetBackedByFile implements a check as to whether a virtual address is backed by a file + + \param offset the virtual address to check + \return whether the offset is backed by a file + */ virtual bool PerformIsOffsetBackedByFile(uint64_t offset); + + /*! PerformGetNextValidOffset implements a query for the next valid readable, writable, or executable virtual memory address after `offset` + + \param offset a virtual address to start checking from + \return the next valid address + */ virtual uint64_t PerformGetNextValidOffset(uint64_t offset); + + /*! PerformGetStart implements a query for the first readable, writable, or executable virtual address in the BinaryView + + \return the first virtual address in the BinaryView + */ virtual uint64_t PerformGetStart() const { return 0; } virtual uint64_t PerformGetLength() const { return 0; } virtual uint64_t PerformGetEntryPoint() const { return 0; } + + /*! PerformIsExecutable implements a check which returns true if the BinaryView is executable. + + \return whether the BinaryView is executable + */ virtual bool PerformIsExecutable() const { return false; } + + /*! PerformGetDefaultEndianness implements a check which returns the Endianness of the BinaryView + + \return either LittleEndian or BigEndian + */ virtual BNEndianness PerformGetDefaultEndianness() const; + + /*! PerformIsRelocatable implements a check which returns true if the BinaryView is relocatable. + + \return whether the BinaryView is relocatable + */ virtual bool PerformIsRelocatable() const; + + /*! PerformGetAddressSize implements a query for the address size for this BinaryView + + \return the address size for this BinaryView + */ virtual size_t PerformGetAddressSize() const; virtual bool PerformSave(FileAccessor* file); @@ -1896,13 +2309,43 @@ namespace BinaryNinja { virtual bool Init() { return true; } + + /*! + \return FileMetadata for this BinaryView + */ FileMetadata* GetFile() const { return m_file; } + + /*! + \return View that contains the raw data used by this view + */ Ref<BinaryView> GetParentView() const; std::string GetTypeName() const; + /*! + \return Whether the file has unsaved modifications + */ bool IsModified() const; + + /*! + \return Whether auto-analysis results have changed. + */ bool IsAnalysisChanged() const; + + /*! Writes the current database (.bndb) out to the specified file. + + \param path path and filename to write the bndb to. Should have ".bndb" appended to it. + \param settings Special save options + \return Whether the save was successful + */ bool CreateDatabase(const std::string& path, Ref<SaveSettings> settings = new SaveSettings()); + + /*! Writes the current database (.bndb) out to the specified file. + + \param path path and filename to write the bndb to. Should have ".bndb" appended to it. + \param progressCallback callback function to send save progress to. + \param settings Special save options + \return Whether the save was successful + */ bool CreateDatabase(const std::string& path, const std::function<bool(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings = new SaveSettings()); @@ -1910,62 +2353,254 @@ namespace BinaryNinja { bool SaveAutoSnapshot(const std::function<bool(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings = new SaveSettings()); + /*! Start recording actions taken so they can be undone at some point + */ void BeginUndoActions(); void AddUndoAction(UndoAction* action); + + /*! Commit the actions taken since the last commit to the undo database. + */ void CommitUndoActions(); + /*! + \return Whether it is possible to perform an Undo + */ bool CanUndo(); + + /*! Undo the last committed action in the undo database. + */ bool Undo(); + + /*! + \return Whether it is possible to perform a Redo + */ bool CanRedo(); + + /*! Redo the last committed action in the undo database. + */ bool Redo(); + /*! + Get the current View name, e.g. ``Linear:ELF``, ``Graph:PE`` + + \return The current view name + */ std::string GetCurrentView(); + + /*! + Get the current offset in the current view + + \return The current offset + */ uint64_t GetCurrentOffset(); + + /*! + Navigate to the specified virtual address in the specified view + + \param view View name. e.g. ``Linear:ELF``, ``Graph:PE`` + \param offset Virtual address to navigate to + \return Whether the navigation was successful. + */ bool Navigate(const std::string& view, uint64_t offset); + /*! Read writes `len` bytes at virtual address `offset` to address `dest` + + \param dest Virtual address to write to + \param offset virtual address to read from + \param len number of bytes to read + \return amount of bytes read + */ size_t Read(void* dest, uint64_t offset, size_t len); + + /*! ReadBuffer reads len bytes from a virtual address into a DataBuffer + + \param offset virtual address to read from + \param len number of bytes to read + \return DataBuffer containing the read bytes + */ DataBuffer ReadBuffer(uint64_t offset, size_t len); + /*! Write writes `len` bytes data at address `dest` to virtual address `offset` + + \param offset virtual address to write to + \param data address to read from + \param len number of bytes to write + \return amount of bytes written + */ size_t Write(uint64_t offset, const void* data, size_t len); + + /*! WriteBuffer writes the contents of a DataBuffer into a virtual address + + \param offset virtual address to write to + \param data DataBuffer containing the bytes to write + \return amount of bytes written + */ size_t WriteBuffer(uint64_t offset, const DataBuffer& data); + /*! Insert inserts `len` bytes data at address `dest` starting from virtual address `offset` + + \param offset virtual address to start inserting from + \param data address to read from + \param len number of bytes to write + \return amount of bytes written + */ size_t Insert(uint64_t offset, const void* data, size_t len); + + /*! InsertBuffer inserts the contents of a DataBuffer starting from a virtual address + + \param offset virtual address to start inserting from + \param data DataBuffer containing the bytes to write + \return amount of bytes written + */ size_t InsertBuffer(uint64_t offset, const DataBuffer& data); + /*! PerformRemove removes `len` bytes from virtual address `offset` + + \param offset the virtual offset to find and remove bytes from + \param len the number of bytes to be removed + \return length of data removed, 0 on error + */ size_t Remove(uint64_t offset, uint64_t len); std::vector<float> GetEntropy(uint64_t offset, size_t len, size_t blockSize); + /*! GetModification checks whether the virtual address `offset` is modified. + + \param offset a virtual address to be checked + \return one of Original, Changed, Inserted + */ BNModificationStatus GetModification(uint64_t offset); std::vector<BNModificationStatus> GetModification(uint64_t offset, size_t len); + /*! IsValidOffset checks whether a virtual address `offset` is valid + + \param offset the virtual address to check + \return whether the offset is valid + */ bool IsValidOffset(uint64_t offset) const; + + /*! IsOffsetReadable checks whether a virtual address is readable + + \param offset the virtual address to check + \return whether the offset is readable + */ bool IsOffsetReadable(uint64_t offset) const; + + /*! IsOffsetWritable checks whether a virtual address is writable + + \param offset the virtual address to check + \return whether the offset is writable + */ bool IsOffsetWritable(uint64_t offset) const; + + /*! IsOffsetExecutable checks whether a virtual address is executable + + \param offset the virtual address to check + \return whether the offset is executable + */ bool IsOffsetExecutable(uint64_t offset) const; + + /*! IsOffsetBackedByFile checks whether a virtual address is backed by a file + + \param offset the virtual address to check + \return whether the offset is backed by a file + */ bool IsOffsetBackedByFile(uint64_t offset) const; bool IsOffsetCodeSemantics(uint64_t offset) const; bool IsOffsetWritableSemantics(uint64_t offset) const; bool IsOffsetExternSemantics(uint64_t offset) const; + + /*! GetNextValidOffset implements a query for the next valid readable, writable, or executable virtual memory address after `offset` + + \param offset a virtual address to start checking from + \return the next valid address + */ uint64_t GetNextValidOffset(uint64_t offset) const; + /*! GetStart queries for the first valid virtual address in the BinaryView + + \return the start of the BinaryView + */ uint64_t GetStart() const; + + /*! GetEnd queries for the first valid virtual address in the BinaryView + + \return the end of the BinaryView + */ uint64_t GetEnd() const; + + /*! GetLength queries for the total length of the BinaryView from start to end + + \return the length of the BinaryView + */ uint64_t GetLength() const; + + /*! GetEntryPoint returns the entry point of the executable in the BinaryView + * + \return the entry point + */ uint64_t GetEntryPoint() const; + /*! GetDefaultArchitecture returns the current "default architecture" for the BinaryView + + \return the current default architecture + */ Ref<Architecture> GetDefaultArchitecture() const; + + /*! SetDefaultArchitecture allows setting the default architecture for the BinaryView + + \param arch the new default architecture + */ void SetDefaultArchitecture(Architecture* arch); + + /*! GetDefaultPlatform returns the current default platform for the BinaryView + + \return the current default Platform + */ Ref<Platform> GetDefaultPlatform() const; + + /*! SetDefaultPlatform allows setting the default platform for the BinaryView + + \param arch the new default platform + */ void SetDefaultPlatform(Platform* platform); + /*! GetDefaultEndianness returns the default endianness for the BinaryView + + \return the current default Endianness, one of LittleEndian, BigEndian + */ BNEndianness GetDefaultEndianness() const; + + /*! Whether the binary is relocatable + + \return Whether the binary is relocatable + */ bool IsRelocatable() const; + + /*! Address size of the binary + + \return Address size of the binary + */ size_t GetAddressSize() const; + /*! Whether the binary is an executable + + \return Whether the binary is an executable + */ bool IsExecutable() const; + /*! Save the original binary file to a FileAccessor + + \param file a FileAccessor pointing to the location to save the binary + \return Whether the save was successful + */ bool Save(FileAccessor* file); + + /*! Save the original binary file to the provided destination + + \param path destination path and filename of the file to be written + \return Whether the save was successful + */ bool Save(const std::string& path); void DefineRelocation(Architecture* arch, BNRelocationInfo& info, uint64_t target, uint64_t reloc); @@ -1974,56 +2609,297 @@ namespace BinaryNinja { std::vector<std::pair<uint64_t, uint64_t>> GetRelocationRangesAtAddress(uint64_t addr) const; bool RangeContainsRelocation(uint64_t addr, size_t size) const; + /*! Provides a mechanism for receiving callbacks for various analysis events. + + \param notify An instance of a class Subclassing BinaryDataNotification + */ void RegisterNotification(BinaryDataNotification* notify); + + /*! Unregister a notification passed to RegisterNotification + + \param notify An instance of a class Subclassing BinaryDataNotification + */ void UnregisterNotification(BinaryDataNotification* notify); + /*! Adds an analysis option. Analysis options elaborate the analysis phase. The user must start analysis by calling either UpdateAnalysis or UpdateAnalysisAndWait + + \param name Name of the analysis option. Available options are "linearsweep" and "signaturematcher" + */ void AddAnalysisOption(const std::string& name); + + /*! Add a new function of the given platform at the virtual address + + \param platform Platform for the function to be loaded + \param addr Virtual adddress of the function to be loaded + */ void AddFunctionForAnalysis(Platform* platform, uint64_t addr); + + /*! adds an virtual address to start analysis from for a given platform + + \param platform Platform for the entry point analysis + \param start virtual address to start analysis from + */ void AddEntryPointForAnalysis(Platform* platform, uint64_t start); + + /*! removes a function from the list of functions + + \param func Function to be removed + */ void RemoveAnalysisFunction(Function* func); + + /*! Add a new user function of the given platform at the virtual address + + \param platform Platform for the function to be loaded + \param addr Virtual adddress of the function to be loaded + */ void CreateUserFunction(Platform* platform, uint64_t start); + + /*! removes a user function from the list of functions + + \param func Function to be removed + */ void RemoveUserFunction(Function* func); + + /*! check for the presence of an initial analysis in this BinaryView. + + \return Whether the BinaryView has an initial analysis + */ bool HasInitialAnalysis(); + + /*! Controls the analysis hold for this BinaryView. Enabling analysis hold defers all future + analysis updates, therefore causing UpdateAnalysis and UpdateAnalysisAndWait to take no action. + + \param enable Whether to enable or disable the analysis hold + */ void SetAnalysisHold(bool enable); + + /*! start the analysis running and dont return till it is complete + + Analysis of BinaryViews does not occur automatically, the user must start analysis by calling either + UpdateAnalysis or UpdateAnalysisAndWait. An analysis update **must** be run after changes are made which could change + analysis results such as adding functions. + */ void UpdateAnalysisAndWait(); + + /*! asynchronously starts the analysis running and returns immediately. + + Analysis of BinaryViews does not occur automatically, the user must start analysis by calling either + UpdateAnalysis or UpdateAnalysisAndWait. An analysis update **must** be run after changes are made which could change + analysis results such as adding functions. + */ void UpdateAnalysis(); + + /*! Abort the currently running analysis + + This method should be considered non-recoverable and generally only used when shutdown is imminent after stopping. + */ void AbortAnalysis(); + /*! Define a DataVariable at a given address with a set type + + \param addr virtual address to define the DataVariable at + \param type Type for the DataVariable + */ void DefineDataVariable(uint64_t addr, const Confidence<Ref<Type>>& type); + + /*! Define a user DataVariable at a given address with a set type + + \param addr virtual address to define the DataVariable at + \param type Type for the DataVariable + */ void DefineUserDataVariable(uint64_t addr, const Confidence<Ref<Type>>& type); + + /*! Undefine a DataVariable at a given address + + \param addr virtual address of the DataVariable + */ void UndefineDataVariable(uint64_t addr); + + /*! Undefine a user DataVariable at a given address + + \param addr virtual address of the DataVariable + */ void UndefineUserDataVariable(uint64_t addr); + /*! Get a map of DataVariables defined in the current BinaryView + + \return A map of addresses to the DataVariables defined at them + */ std::map<uint64_t, DataVariable> GetDataVariables(); + + /*! Get a DataVariable at a given address + + \param addr Address for the DataVariable + \param var Reference to a DataVariable class to write to + \return Whether a DataVariable was successfully retrieved + */ bool GetDataVariableAtAddress(uint64_t addr, DataVariable& var); + /*! Get a list of functions within this BinaryView + + \return vector of Functions within the BinaryView + */ std::vector<Ref<Function>> GetAnalysisFunctionList(); + + /*! Check whether the BinaryView has any functions defined + + \return Whether the BinaryView has any functions defined + */ bool HasFunctions() const; + + + /*! Gets a function object for the function starting at a virtual address + + \param platform Platform for the desired function + \param addr Starting virtual address for the function + \return the Function, if it exists + */ Ref<Function> GetAnalysisFunction(Platform* platform, uint64_t addr); + + /*! Get the most recently used Function starting at a virtual address + + \param addr Starting virtual address for the function + \return the Function, if it exists + */ Ref<Function> GetRecentAnalysisFunctionForAddress(uint64_t addr); + + /*! Get a list of functions defined at an address + + \param addr Starting virtual address for the function + \return vector of functions + */ std::vector<Ref<Function>> GetAnalysisFunctionsForAddress(uint64_t addr); + + /*! Get a list of functions containing an address + + \param addr Address to check + \return vector of Functions + */ std::vector<Ref<Function>> GetAnalysisFunctionsContainingAddress(uint64_t addr); + + /*! Get the function defined as the Analysis entry point for the view + + \return The analysis entry point function + */ Ref<Function> GetAnalysisEntryPoint(); + + /*! Get most recently used Basic Block containing a virtual address + + \param addr Address within the BasicBlock + \return The BasicBlock if it exists + */ Ref<BasicBlock> GetRecentBasicBlockForAddress(uint64_t addr); + + /*! Get a list of Basic Blocks containing a virtual address + + \param addr Address to check + \return vector of basic blocks containing that address + */ std::vector<Ref<BasicBlock>> GetBasicBlocksForAddress(uint64_t addr); + + /*! Get a list of basic blocks starting at a virtual address + + \param addr Address to check + \return vector of basic blocks starting at that address + */ std::vector<Ref<BasicBlock>> GetBasicBlocksStartingAtAddress(uint64_t addr); + /*! Get Code References to a virtual address + + \param addr Address to check + \return vector of ReferenceSources referencing the virtual address + */ std::vector<ReferenceSource> GetCodeReferences(uint64_t addr); + + /*! Get Code References to a virtual address + + \param addr Address to check + \param len Length of query + \return vector of ReferenceSources referencing the virtual address range + */ std::vector<ReferenceSource> GetCodeReferences(uint64_t addr, uint64_t len); + + /*! Get code references from a ReferenceSource + + \param src reference source + \return List of virtual addresses referenced by this source + */ std::vector<uint64_t> GetCodeReferencesFrom(ReferenceSource src); + + /*! Get code references from a ReferenceSource + + \param src reference source + \param len Length of query + \return List of virtual addresses referenced by this source + */ std::vector<uint64_t> GetCodeReferencesFrom(ReferenceSource src, uint64_t len); + /*! Get Data References to a virtual address + + \param addr Address to check + \return vector of virtual addresses referencing the virtual address + */ std::vector<uint64_t> GetDataReferences(uint64_t addr); + + /*! Get Data References to a virtual address + + \param addr Address to check + \param len Length of query + \return vector of virtual addresses referencing the virtual address range + */ std::vector<uint64_t> GetDataReferences(uint64_t addr, uint64_t len); + + /*! Get Data references from a virtual address + + \param src reference source + \return List of virtual addresses referenced by this address + */ std::vector<uint64_t> GetDataReferencesFrom(uint64_t addr); + + /*! Get Data references from a virtual address + + \param src reference source + \param len Length of query + \return List of virtual addresses referenced by this address + */ std::vector<uint64_t> GetDataReferencesFrom(uint64_t addr, uint64_t len); + + /*! Add a user Data Reference from a virtual address to another virtual address + + \param fromAddr Address referencing the toAddr value + \param toAddr virtual address being referenced + */ void AddUserDataReference(uint64_t fromAddr, uint64_t toAddr); + + /*! Remove a user Data Reference from a virtual address to another virtual address + + \param fromAddr Address referencing the toAddr value + \param toAddr virtual address being referenced + */ void RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr); // References to type + + /*! Get code references to a Type + + \param type QualifiedName for a Type + \return vector of ReferenceSources + */ std::vector<ReferenceSource> GetCodeReferencesForType(const QualifiedName& type); + + /*! Get data references to a Type + + \param type QualifiedName for a Type + \return vector of virtual addresses referencing this Type + */ std::vector<uint64_t> GetDataReferencesForType(const QualifiedName& type); + + /*! Get Type references to a Type + + \param type QualifiedName for a Type + \return vector of TypeReferenceSources to this Type + */ std::vector<TypeReferenceSource> GetTypeReferencesForType(const QualifiedName& type); // References to type field @@ -3121,24 +3997,101 @@ namespace BinaryNinja { bool operator==(const Type& other); bool operator!=(const Type& other); + + /*! Retrieve the Type Class for this Structure + + One of: + VoidTypeClass + BoolTypeClass + IntegerTypeClass + FloatTypeClass + StructureTypeClass + EnumerationTypeClass + PointerTypeClass + ArrayTypeClass + FunctionTypeClass + VarArgsTypeClass + ValueTypeClass + NamedTypeReferenceClass + WideCharTypeClass + + \return The type class + */ BNTypeClass GetClass() const; + + /*! Get the width in bytes of the Type + + \return The type width + */ uint64_t GetWidth() const; size_t GetAlignment() const; + + /*! Get the QualifiedName for the Type + + \return The QualifiedName for the type + */ QualifiedName GetTypeName() const; + + /*! Whether the type is signed + */ Confidence<bool> IsSigned() const; + + /*! Whether the type is constant + + */ Confidence<bool> IsConst() const; - Confidence<bool> IsVolatile() const; + Confidence<bool> IsVolatile() const; // Unimplemented! bool IsSystemCall() const; + + /*! Get the child type for this Type if one exists + + \return The child type + */ Confidence<Ref<Type>> GetChildType() const; + + /*! For Function Types, get the calling convention + + \return The CallingConvention + */ Confidence<Ref<CallingConvention>> GetCallingConvention() const; + + /*! For Function Types, get a list of parameters + + \return A vector of FunctionParameters + */ std::vector<FunctionParameter> GetParameters() const; + + /*! For Function Types, whether the Function has variadic arguments + + \return Whether the function has variable arguments + */ Confidence<bool> HasVariableArguments() const; + + /*! For Function Types, whether a function can return (is not marked noreturn) + + \return Whether the function can return + */ Confidence<bool> CanReturn() const; + + /*! For Structure Types, the underlying Structure + + \return The underlying structure + */ Ref<Structure> GetStructure() const; + + /*! For Enumeration Types, the underlying Enumeration + + \return The underlying enumeration + */ Ref<Enumeration> GetEnumeration() const; + + /*! For NamedTypeReference Types, the underlying NamedTypeReference + + \return The underlying NamedTypeReference + */ Ref<NamedTypeReference> GetNamedTypeReference() const; - Confidence<BNMemberScope> GetScope() const; + Confidence<BNMemberScope> GetScope() const; // Unimplemented! Confidence<int64_t> GetStackAdjustment() const; QualifiedName GetStructureName() const; Ref<NamedTypeReference> GetRegisteredName() const; @@ -3165,11 +4118,44 @@ namespace BinaryNinja { Ref<Type> Duplicate() const; + + /*! Create a "void" type + + \return The created Type object + */ static Ref<Type> VoidType(); + + /*! Create a "bool" type + + \return The created Type object + */ static Ref<Type> BoolType(); + + /*! Create a signed or unsigned integer with a set width + + \param width Width of the Type in bytes + \param sign Whether the integer is a signed or unsigned type + \param altName Alternative name for the type + \return The created Type object + */ static Ref<Type> IntegerType(size_t width, const Confidence<bool>& sign, const std::string& altName = ""); + + /*! Create a float or double Type with a specified width + + \param width Width of the Type in bytes + \param altName Alternative name for the type + \return The created Type object + */ static Ref<Type> FloatType(size_t width, const std::string& altName = ""); static Ref<Type> WideCharType(size_t width, const std::string& altName = ""); + + /*! Create a Type object from a Structure object + + Structure objects can be generated using the StructureBuilder class. + + \param strct Structure object + \return The created Type object + */ static Ref<Type> StructureType(Structure* strct); static Ref<Type> NamedType(NamedTypeReference* ref, size_t width = 0, size_t align = 1, const Confidence<bool>& cnst = Confidence<bool>(false, 0), @@ -3181,17 +4167,105 @@ namespace BinaryNinja { const Confidence<bool>& isSigned = Confidence<bool>(false, 0)); static Ref<Type> EnumerationType( Enumeration* enm, size_t width, const Confidence<bool>& isSigned = Confidence<bool>(false, 0)); + + /*! Create a Pointer type, which points to another Type + + \code{.cpp} + // Creating a "char *" type + auto arch = bv->GetDefaultArchitecture(); + auto charPointerType = Type::PointerType(arch, Type::IntegerType(1, false)); + \endcode + + \param arch Architecture, used to calculate the proper pointer width + \param type Type that this Type points to + \param cnst Whether this type is const + \param vltl Whether this type is volatile + \param refType Reference Type, one of "PointerReferenceType", "ReferenceReferenceType", "RValueReferenceType", "NoReference" + \return The created type + */ static Ref<Type> PointerType(Architecture* arch, const Confidence<Ref<Type>>& type, const Confidence<bool>& cnst = Confidence<bool>(false, 0), const Confidence<bool>& vltl = Confidence<bool>(false, 0), BNReferenceType refType = PointerReferenceType); + + /*! Create a Pointer type, which points to another Type + + \code{.cpp} + // Creating a "char *" type in a binary compiled for 64 bit address spaces + auto charPointerType = Type::PointerType(8, Type::IntegerType(1, false)); + \endcode + + \param width Width of the pointer in bytes + \param type Type that this type points to + \param cnst Whether this type is const + \param vltl Whether this type is volatile + \param refType Reference Type, one of "PointerReferenceType", "ReferenceReferenceType", "RValueReferenceType", "NoReference" + \return The created type + */ static Ref<Type> PointerType(size_t width, const Confidence<Ref<Type>>& type, const Confidence<bool>& cnst = Confidence<bool>(false, 0), const Confidence<bool>& vltl = Confidence<bool>(false, 0), BNReferenceType refType = PointerReferenceType); + + /*! Create an Array Type + + \param type Type for Elements contained in this Array + \param elem Number of elements + \return The created Type + */ static Ref<Type> ArrayType(const Confidence<Ref<Type>>& type, uint64_t elem); + + /*! Create a Function Type + + \code{.cpp} + Ref<Type> retType = Type::VoidType(); + + std::vector<FunctionParameter> params + auto cc = bv->GetDefaultPlatform()->GetDefaultCallingConvention(); + + params.push_back({"arg0", + Type::IntegerType(8, false), + true, + Variable()}); + + auto functionType = Type::FunctionType(retType, cc, params); + \endcode + + \param returnValue Return value Type + \param callingConvention Calling convention for the function + \param params list of FunctionParameter s + \param varArg Whether this function has variadic arguments, default false + \param stackAdjust Stack adjustment for this function, default 0 + \return The created function types + */ static Ref<Type> FunctionType(const Confidence<Ref<Type>>& returnValue, const Confidence<Ref<CallingConvention>>& callingConvention, const std::vector<FunctionParameter>& params, const Confidence<bool>& varArg = Confidence<bool>(false, 0), const Confidence<int64_t>& stackAdjust = Confidence<int64_t>(0, 0)); + + /*! Create a Function Type + + \code{.cpp} + Ref<Type> retType = Type::VoidType(); + + std::vector<FunctionParameter> params + auto cc = bv->GetDefaultPlatform()->GetDefaultCallingConvention(); + + params.push_back({"arg0", + Type::IntegerType(8, false), + true, + Variable()}); + + auto functionType = Type::FunctionType(retType, cc, params); + \endcode + + \param returnValue Return value Type + \param callingConvention Calling convention for the function + \param params list of FunctionParameters + \param varArg Whether this function has variadic arguments, default false + \param stackAdjust Stack adjustment for this function, default 0 + \param regStackAdjust Register stack adjustmemt + \param returnRegs Return registers + \return The created function types + */ static Ref<Type> FunctionType(const Confidence<Ref<Type>>& returnValue, const Confidence<Ref<CallingConvention>>& callingConvention, const std::vector<FunctionParameter>& params, @@ -3208,31 +4282,136 @@ namespace BinaryNinja { static std::string GenerateAutoDebugTypeId(const QualifiedName& name); static std::string GetAutoDebugTypeIdSource(); + /*! Get this type wrapped in a Confidence template + + \param conf Confidence value between 0 and 255 + \return Confidence-wrapped Type + */ Confidence<Ref<Type>> WithConfidence(uint8_t conf); + /*! If this Type is a NamedTypeReference, check whether it is reference to a specific Type + + \param refType BNNamedTypeReference to check it against + \return Whether it is a reference of this type + */ bool IsReferenceOfType(BNNamedTypeReferenceClass refType); + + /*! If this Type is a NamedTypeReference, check whether it refers to a Struct Type + + \return Whether it refers to a struct type. + */ bool IsStructReference() { return IsReferenceOfType(StructNamedTypeClass); } + + /*! If this Type is a NamedTypeReference, check whether it refers to an Enum Type + + \return Whether it refers to an Enum type. + */ bool IsEnumReference() { return IsReferenceOfType(EnumNamedTypeClass); } + + /*! If this Type is a NamedTypeReference, check whether it refers to a Union Type + + \return Whether it refers to a union type. + */ bool IsUnionReference() { return IsReferenceOfType(UnionNamedTypeClass); } + + /*! If this Type is a NamedTypeReference, check whether it refers to a Class Type + + \return Whether it refers to a class type. + */ bool IsClassReference() { return IsReferenceOfType(ClassNamedTypeClass); } + + /*! If this Type is a NamedTypeReference, check whether it refers to a Typedef type + + \return Whether it refers to a typedef type. + */ + bool IsTypedefReference() { return IsReferenceOfType(TypedefNamedTypeClass); } + + /*! If this Type is a NamedTypeReference, check whether it refers to a Struct or Class Type + + \return Whether it refers to a struct or class type. + */ bool IsStructOrClassReference() { return IsReferenceOfType(StructNamedTypeClass) || IsReferenceOfType(ClassNamedTypeClass); } + /*! Check whether this type is a Void type. + + \return Whether this->GetClass() == VoidTypeClass + */ bool IsVoid() const { return GetClass() == VoidTypeClass; } + + /*! Check whether this type is a Boolean type. + + \return Whether this->GetClass() == BoolTypeClass + */ bool IsBool() const { return GetClass() == BoolTypeClass; } + + /*! Check whether this type is an Integer type. + + \return Whether this->GetClass() == IntegerTypeClass + */ bool IsInteger() const { return GetClass() == IntegerTypeClass; } + + /*! Check whether this type is a Float type. + + \return Whether this->GetClass() == FloatTypeClass + */ bool IsFloat() const { return GetClass() == FloatTypeClass; } + + /*! Check whether this type is a Structure type. + + \return Whether this->GetClass() == StructureTypeClass + */ bool IsStructure() const { return GetClass() == StructureTypeClass; } + + /*! Check whether this type is an Enumeration type. + + \return Whether this->GetClass() == EnumerationTypeClass + */ bool IsEnumeration() const { return GetClass() == EnumerationTypeClass; } + + /*! Check whether this type is a Pointer type. + + \return Whether this->GetClass() == PointerTypeClass + */ bool IsPointer() const { return GetClass() == PointerTypeClass; } + + /*! Check whether this type is an Array type. + + \return Whether this->GetClass() == ArrayTypeClass + */ bool IsArray() const { return GetClass() == ArrayTypeClass; } + + /*! Check whether this type is a Function type. + + \return Whether this->GetClass() == FunctionTypeClass + */ bool IsFunction() const { return GetClass() == FunctionTypeClass; } + + /*! Check whether this type is a Variadic Arguments type. + + \return Whether this->GetClass() == VarArgsTypeClass + */ bool IsVarArgs() const { return GetClass() == VarArgsTypeClass; } + + /*! Check whether this type is a Value type. + + \return Whether this->GetClass() == ValueTypeClass + */ bool IsValue() const { return GetClass() == ValueTypeClass; } + + /*! Check whether this type is a Named Type Reference type. + + \return Whether this->GetClass() == NamedTypeReferenceClass + */ bool IsNamedTypeRefer() const { return GetClass() == NamedTypeReferenceClass; } + + /*! Check whether this type is a Wide Char type. + + \return Whether this->GetClass() == WideCharTypeClass + */ bool IsWideChar() const { return GetClass() == WideCharTypeClass; } Ref<Type> WithReplacedStructure(Structure* from, Structure* to); @@ -3468,9 +4647,24 @@ namespace BinaryNinja { StructureBuilder& operator=(Structure* s); BNStructureBuilder* GetObject() { return m_object; }; + /*! Complete the structure building process and return a Structure object + + \return a built Structure object + */ Ref<Structure> Finalize() const; + /*! GetMembers returns a list of structure members + + \return vector of StructureMember objects + */ std::vector<StructureMember> GetMembers() const; + + /*! GetMemberByName retrieves a structure member by name + + \param name Name of the member (field) + \param result Reference to a StructureMember object the field will be passed to + \return Whether a StructureMember was successfully retrieved + */ bool GetMemberByName(const std::string& name, StructureMember& result) const; bool GetMemberAtOffset(int64_t offset, StructureMember& result) const; bool GetMemberAtOffset(int64_t offset, StructureMember& result, size_t& idx) const; @@ -3481,13 +4675,59 @@ namespace BinaryNinja { bool IsPacked() const; StructureBuilder& SetPacked(bool packed); bool IsUnion() const; + + /*! Set the structure type + + \param type One of: ClassStructureType, StructStructureType, UnionStructureType + \return reference to this StructureBuilder + */ StructureBuilder& SetStructureType(BNStructureVariant type); + + /*! Get the Structure Type + + \return One of: ClassStructureType, StructStructureType, UnionStructureType + */ BNStructureVariant GetStructureType() const; + + /*! AddMember adds a member (field) to a structure + + \param type Type of the Field + \param name Name of the field + \param access Optional, One of NoAccess, PrivateAccess, ProtectedAccess, PublicAccess + \param scope Optional, One of NoScope, StaticScope, VirtualScope, ThunkScope, FriendScope + \return reference to the Structure Builder + */ StructureBuilder& AddMember(const Confidence<Ref<Type>>& type, const std::string& name, BNMemberAccess access = NoAccess, BNMemberScope scope = NoScope); + + /*! AddMemberAtOffset adds a member at a specific offset within the struct + + \param type Type of the Field + \param name Name of the field + \param offset Offset to add the member within the struct + \param overwriteExisting Whether to overwrite an existing member at that offset, Optional, default true + \param access One of NoAccess, PrivateAccess, ProtectedAccess, PublicAccess + \param scope One of NoScope, StaticScope, VirtualScope, ThunkScope, FriendScope + \return Reference to the StructureBuilder + */ StructureBuilder& AddMemberAtOffset(const Confidence<Ref<Type>>& type, const std::string& name, uint64_t offset, bool overwriteExisting = true, BNMemberAccess access = NoAccess, BNMemberScope scope = NoScope); + + /*! RemoveMember removes a member at a specified index + + \param idx Index to remove + \return Reference to the StructureBuilder + */ StructureBuilder& RemoveMember(size_t idx); + + /*! ReplaceMember replaces a member at an index + + \param idx Index of the StructureMember to be replaced + \param type Type of the new Member + \param name Name of the new Member + \param overwriteExisting Whether to overwrite the existing member, default true + \return Reference to the StructureBuilder + */ StructureBuilder& ReplaceMember( size_t idx, const Confidence<Ref<Type>>& type, const std::string& name, bool overwriteExisting = true); }; @@ -3523,13 +4763,49 @@ namespace BinaryNinja { EnumerationBuilder& operator=(EnumerationBuilder&& e); EnumerationBuilder& operator=(Enumeration* e); + /*! Finalize the building process and return the built Enumeration + + \return the Enumeration + */ Ref<Enumeration> Finalize() const; + /*! Get a list of members in this enum + + \return list of EnumerationMember + */ std::vector<EnumerationMember> GetMembers() const; + /*! Add a member to the enum. + + \note If there is already a member in the Enum, the value of newly added ones will be the value of the previously added one + 1 + + \param name Name of the enum member + \return A reference to this EnumerationBuilder + */ EnumerationBuilder& AddMember(const std::string& name); + + /*! Add a member to the enum with a set value + + \param name Name of the enum member + \param value Value of th enum member + \return A reference to this EnumerationBuilder + */ EnumerationBuilder& AddMemberWithValue(const std::string& name, uint64_t value); + + /*! Remove a member from the enum + + \param idx Index to remove + \return A reference to this EnumerationBuilder + */ EnumerationBuilder& RemoveMember(size_t idx); + + /*! Replace a member at an index + + \param idx Index to replace + \param name Name of the new member + \param value Value of the new member + \return A reference to this EnumerationBuilder + */ EnumerationBuilder& ReplaceMember(size_t idx, const std::string& name, uint64_t value); }; @@ -3834,27 +5110,119 @@ namespace BinaryNinja { Function(BNFunction* func); virtual ~Function(); + /*! Get the BinaryView this Function is defined in + + \return a BinaryView reference + */ Ref<BinaryView> GetView() const; + + /*! Get the architecture this function was defined with + + \return an Architecture reference + */ Ref<Architecture> GetArchitecture() const; + + /*! Get the platform this function was defined with + + \return a Platform reference + */ Ref<Platform> GetPlatform() const; + + /*! Get the starting virtual address of this function + + \return the start address + */ uint64_t GetStart() const; + + /*! Get the Symbol for this function + + \return a Symbol reference + */ Ref<Symbol> GetSymbol() const; + + /*! Whether this function was automatically discovered by analysis + + \return Whether the function was automatically discovered + */ bool WasAutomaticallyDiscovered() const; + + /*! Whether this function has user annotations + + \return Whether this function has user annotations + */ bool HasUserAnnotations() const; + + /*! Whether this function can return + + \return Whether this function can return + */ Confidence<bool> CanReturn() const; + + /*! Whether this function has an explicitly defined type + + \return Whether this function has an explicitly defined type + */ bool HasExplicitlyDefinedType() const; + + /*! Whether this function needs update + + \return Whether this function needs update + */ bool NeedsUpdate() const; + /*! Get a list of Basic Blocks for this function + + \return a list of BasicBlock references for this function + */ std::vector<Ref<BasicBlock>> GetBasicBlocks() const; + + /*! Get the basic block an address is located in + + \param arch Architecture for the basic block + \param addr Address to check + \return + */ Ref<BasicBlock> GetBasicBlockAtAddress(Architecture* arch, uint64_t addr) const; + + /*! Mark this function as recently used + */ void MarkRecentUse(); + /*! Get the function comment + + \return The function comment + */ std::string GetComment() const; + + /*! Get a comment located at an address + + \return The comment at an address + */ std::string GetCommentForAddress(uint64_t addr) const; + + /*! Get a list of addresses with comments + + \return A list of virtual addresses with comments + */ std::vector<uint64_t> GetCommentedAddresses() const; + + /*! Set the comment for the function + + \param comment The new function comment + */ void SetComment(const std::string& comment); + + /*! Set the comment at an address + + \param addr Address for the comment + \param comment Text of the comment + */ void SetCommentForAddress(uint64_t addr, const std::string& comment); + /*! Get a list of callsites for this function + + \return a list of ReferenceSource + */ std::vector<ReferenceSource> GetCallSites() const; void AddUserCodeReference(Architecture* fromArch, uint64_t fromAddr, uint64_t toAddr); @@ -3866,8 +5234,24 @@ namespace BinaryNinja { void RemoveUserTypeFieldReference( Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name, uint64_t offset, size_t size = 0); + /*! Get the LLIL for this function + + \return a LowLevelILFunction reference + */ Ref<LowLevelILFunction> GetLowLevelIL() const; + + /*! Get the LLIL for this function if it is available + + \return a LowLevelILFunction reference + */ Ref<LowLevelILFunction> GetLowLevelILIfAvailable() const; + + /*! Get the Low Level IL Instruction start for an instruction at an address + + \param arch Architecture for the instruction + \param addr Address of the instruction + \return Start address of the instruction + */ size_t GetLowLevelILForInstruction(Architecture* arch, uint64_t addr); std::set<size_t> GetLowLevelILInstructionsForAddress(Architecture* arch, uint64_t addr); std::vector<size_t> GetLowLevelILExitsForInstruction(Architecture* arch, uint64_t addr); diff --git a/python/binaryview.py b/python/binaryview.py index fe182925..d8a5d387 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -3138,7 +3138,7 @@ class BinaryView: def perform_get_default_endianness(self) -> Endianness: """ - ``perform_get_default_endianness`` implements a check which returns true if the BinaryView is executable. + ``perform_get_default_endianness`` implements a check which returns the Endianness of the BinaryView .. note:: This method **may** be implemented for custom BinaryViews that are not LittleEndian. @@ -3303,18 +3303,25 @@ class BinaryView: def navigate(self, view_name: str, offset: int) -> bool: """ - ``navigate`` navigates the UI to the specified virtual address + ``navigate`` navigates the UI to the specified virtual address in the specified View - .. note:: Despite the confusing name, ``view`` in this context is not a BinaryView but rather a string describing the different UI Views. Check :py:attr:`view` while in different views to see examples such as ``Linear:ELF``, ``Graph:PE``. + The View name is created by combining a View type (e.g. "Graph") with a BinaryView type (e.g. "Mach-O"), + seperated by a colon, resulting in something like "Graph:Mach-O". - :param str view: virtual address to read from. + :param str view_name: View name. :param int offset: address to navigate to - :return: whether or not navigation succeeded + :return: whether navigation succeeded :rtype: bool :Example: - >>> import random - >>> bv.navigate(bv.view, random.choice(list(bv.functions)).start) + >>> bv.navigate(bv.view, bv.start) + True + >>> bv.file.existing_views + ['Mach-O', 'Raw'] + >>> import binaryninjaui + >>> [i.getName() for i in binaryninjaui.ViewType.getTypes()] + ['Graph', 'Hex', 'Linear', 'Strings', 'Types', 'Triage', 'Bytes'] + >>> bv.navigate('Graph:Mach-O', bv.entry_point) True """ return self._file.navigate(view_name, offset) @@ -3598,7 +3605,7 @@ class BinaryView: def add_entry_point(self, addr: int, plat: Optional['_platform.Platform'] = None) -> None: """ - ``add_entry_point`` adds an virtual address to start analysis from for a given plat. + ``add_entry_point`` adds a virtual address to start analysis from for a given plat. :param int addr: virtual address to start analysis from :param Platform plat: Platform for the entry point analysis @@ -3912,7 +3919,7 @@ class BinaryView: ``get_function_at`` gets a Function object for the function that starts at virtual address ``addr``: :param int addr: starting virtual address of the desired function - :param Platform plat: plat of the desired function + :param Platform plat: platform of the desired function :return: returns a Function object or None for the function at the virtual address provided :rtype: Function :Example: diff --git a/python/filemetadata.py b/python/filemetadata.py index bd9a9954..6b655fee 100644 --- a/python/filemetadata.py +++ b/python/filemetadata.py @@ -165,6 +165,7 @@ class FileMetadata: @property def nav(self) -> Optional[NavigationHandler]: + """Navigation handler for this FileMetadata (read/write)""" return self._nav @nav.setter @@ -304,7 +305,7 @@ class FileMetadata: def begin_undo_actions(self) -> None: """ - ``begin_undo_actions`` start recording actions taken so the can be undone at some point. + ``begin_undo_actions`` start recording actions taken so they can be undone at some point. :rtype: None :Example: @@ -502,7 +503,7 @@ class FileMetadata: if view_type is None: return None - assert self.raw is not None, "BinaryView.save_auto_snapshot called when raw view is None" + assert self.raw is not None, "BinaryView.get_view_of_type called when raw view is None" view = core.BNCreateBinaryViewOfType(view_type, self.raw.handle) if view is None: return None diff --git a/python/types.py b/python/types.py index ea70a6c5..2734f0a9 100644 --- a/python/types.py +++ b/python/types.py @@ -336,6 +336,7 @@ class CoreSymbol: @property def auto(self) -> bool: + """Whether the symbol was auto-defined""" return core.BNIsSymbolAutoDefined(self._handle) @property |
