├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── Makefile.am ├── README.md ├── autogen.sh ├── configure.ac ├── docs ├── Makefile.am ├── doxy-boot.js ├── favicon.ico ├── footer.html ├── header-api.html ├── header-internal.html ├── header.html ├── imquic-api.cfg ├── imquic-internal.cfg ├── imquic.cfg ├── imquic.css ├── mainpage-api.dox ├── mainpage-internal.dox ├── mainpage.dox └── meetecho-logo.png ├── examples ├── Makefile.am ├── README.md ├── echo-client-options.c ├── echo-client-options.h ├── echo-client.c ├── echo-server-options.c ├── echo-server-options.h ├── echo-server.c ├── moq-pub-options.c ├── moq-pub-options.h ├── moq-pub.c ├── moq-relay-options.c ├── moq-relay-options.h ├── moq-relay.c ├── moq-sub-options.c ├── moq-sub-options.h ├── moq-sub.c ├── moq-test-options.c ├── moq-test-options.h ├── moq-test.c ├── moq-utils.c ├── moq-utils.h ├── roq-client-options.c ├── roq-client-options.h ├── roq-client.c ├── roq-server-options.c ├── roq-server-options.h └── roq-server.c ├── imquic.pc.in └── src ├── Makefile.am ├── buffer.c ├── connection.c ├── crypto.c ├── error.c ├── http3.c ├── imquic-moq.c ├── imquic-roq.c ├── imquic.c ├── imquic ├── debug.h ├── imquic.h ├── moq.h └── roq.h ├── internal ├── buffer.h ├── configuration.h ├── connection.h ├── crypto.h ├── error.h ├── http3.h ├── huffman.h ├── listmap.h ├── loop.h ├── moq.h ├── mutex.h ├── network.h ├── qlog.h ├── qpack.h ├── quic.h ├── refcount.h ├── roq.h ├── stream.h ├── utils.h └── version.h ├── listmap.c ├── loop.c ├── moq.c ├── network.c ├── qlog.c ├── qpack.c ├── quic.c ├── roq.c ├── stream.c └── utils.c /.gitignore: -------------------------------------------------------------------------------- 1 | imquic-echo-client 2 | imquic-echo-server 3 | imquic-roq-client 4 | imquic-roq-server 5 | imquic-moq-pub 6 | imquic-moq-sub 7 | imquic-moq-chat 8 | imquic-moq-test 9 | imquic-moq-relay 10 | 11 | version.c 12 | docs/html/ 13 | 14 | Makefile 15 | Makefile.in 16 | build 17 | configure 18 | configure~ 19 | autom4te.cache 20 | aclocal.m4 21 | m4 22 | missing 23 | libtool 24 | depcomp 25 | compile 26 | install-sh 27 | install-sh~ 28 | ltmain.sh 29 | 30 | config.log 31 | config.guess 32 | config.status 33 | config.sub 34 | 35 | imquic.pc 36 | 37 | *.o 38 | *.a 39 | *.lo 40 | *.la 41 | .libs 42 | 43 | .deps 44 | .dirstamp 45 | 46 | # OS X 47 | .DS_Store 48 | 49 | # CLion 50 | .idea 51 | 52 | .vscode 53 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | 6 | ## [v0.0.1] - 2024-XX-XX 7 | 8 | - First alpha release 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024-2025 Meetecho 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile.am: -------------------------------------------------------------------------------- 1 | ACLOCAL_AMFLAGS = -I m4 2 | 3 | # FIXME: make docs work with distcheck 4 | DISTCHECK_CONFIGURE_FLAGS = --disable-docs 5 | 6 | EXTRA_DIST = imquic.pc.in 7 | pkgconfigdir = $(libdir)/pkgconfig 8 | pkgconfig_DATA = imquic.pc 9 | DISTCLEANFILES = imquic.pc 10 | 11 | SUBDIRS = src examples docs 12 | #~ dist_html_DATA = README.md 13 | 14 | .PHONY: FORCE 15 | FORCE: 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | imquic 2 | ====== 3 | 4 | imquic is an open source QUIC library designed and developed by [Meetecho](https://www.meetecho.com) for the specific purpose of experimenting with QUIC-based multimedia applications. While it can be used as a generic QUIC (and WebTransport) library, it also comes with experimental native RTP Over QUIC (RoQ) and Media Over QUIC (MoQ) support. At the time of writing, there's no support for HTTP/3 beyond the simple establishment of WebTransport connections. 5 | 6 | For more information and documentations, make sure you pay the [project website](https://imquic.conf.meetecho.com) a visit! 7 | 8 | > **Note well:** in its current stage, the library should be considered at an **alpha** stage, and very experimental due to its lack of support for some QUIC stack functionality. It is currently being used by Meetecho for prototyping RoQ and MoQ demos in local and controlled environments, and will probably not always work as expected in more challenging network scenarios. 9 | 10 | ## Dependencies 11 | 12 | To compile imquic, you'll need to satisfy the following dependencies: 13 | 14 | * [GLib](https://docs.gtk.org/glib/) 15 | * [pkg-config](http://www.freedesktop.org/wiki/Software/pkg-config/) 16 | * [quictls](https://quictls.github.io/) (QUIC TLS) 17 | * [Jansson](https://github.com/akheron/jansson) (optional; QLOG support) 18 | 19 | > **Note:** You can also use BoringSSL, instead of quictls, by passing `--enable-boringssl=`, albeit without early-data support. If BoringSSL is installed in `/opt/boringssl`, the configure script will expect header files in `/opt/boringssl/include` and shared (not static) objects in `/opt/boringssl/lib64`. You'll then need to manually export `LD_LIBRARY_PATH` to the path where BoringSSL shared objects are, when using an application that's linked to the library. 20 | 21 | Should you be interested in building the imquic documentation as well (public and internal), you'll need some additional tools too: 22 | 23 | * [Doxygen](https://www.doxygen.org) 24 | * [Graphviz](https://www.graphviz.org/) 25 | 26 | Notice that, at the time of writing, only Linux is supported as a target, but the library should compile on macOS as well. Both macOS and Windows, as well as other platforms, are planned as a target in future releases. 27 | 28 | ## Compile 29 | 30 | Once you have installed all the dependencies, just use: 31 | 32 | sh autogen.sh 33 | 34 | to generate the configure file. After that, configure and compile as usual to start the whole compilation process: 35 | 36 | ./configure --prefix=/usr 37 | make 38 | make install 39 | 40 | Note that the configure script uses `pkg-config` to look for quictls by using the `openssl+quictls` name, which is how it's packaged in some repositories to avoid conflicts with OpenSSL. In case that doesn't work for you, you can use the `QUICTLS_CFLAGS` and `QUICTLS_LIBS` environment variables to specify the include and lib directory of the library when launching the configure script, e.g. 41 | 42 | QUICTLS_CFLAGS="-I/opt/quictls/include/" \ 43 | QUICTLS_LIBS="-L/opt/quictls/lib64/ -lssl -lcrypto" \ 44 | ./configure [..] 45 | 46 | Should that still result in compilation issues, you can try adding the path to the quictls library to ld, which is what the above mentioned repositories do, e.g. 47 | 48 | echo "/opt/quictls/lib64" > /etc/ld.so.conf.d/quictls-x86_64.conf 49 | ldconfig 50 | 51 | If you're interested in QLOG support, add `--enable-qlog` when launching the `configure` script. Notice that this will require [Jansson](https://github.com/akheron/jansson). 52 | 53 | You can build some demo applications by adding `--enable-echo-examples` (basic QUIC/WebTransport client/server demos), `--enable-roq-examples` (RoQ demos) and `--enable-moq-examples` (MoQ demos). 54 | 55 | To build the documentation, add `--enable-docs`. 56 | 57 | ## Examples 58 | 59 | To learn more about the demo examples, refer to the related [README.md](examples/README.md). 60 | 61 | ## Help us! 62 | Any thought, feedback or (hopefully not!) insult is welcome! 63 | 64 | Developed by [@meetecho](https://github.com/meetecho) 65 | -------------------------------------------------------------------------------- /autogen.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | srcdir=`dirname $0` 4 | test -z "$srcdir" && srcdir=. 5 | 6 | mkdir -p m4 7 | 8 | autoreconf --verbose --force --install || exit 1 9 | -------------------------------------------------------------------------------- /configure.ac: -------------------------------------------------------------------------------- 1 | AC_INIT([imquic],[0.0.1],[https://github.com/meetecho/imquic],[imquic],[https://imquic.conf.meetecho.com]) 2 | AC_LANG(C) 3 | AC_CONFIG_AUX_DIR([.]) 4 | AC_CONFIG_MACRO_DIR([m4]) 5 | 6 | AC_ENABLE_SHARED(yes) 7 | AC_ENABLE_STATIC(no) 8 | 9 | AM_INIT_AUTOMAKE([foreign subdir-objects]) 10 | AM_SILENT_RULES([yes]) 11 | 12 | AC_USE_SYSTEM_EXTENSIONS 13 | 14 | AC_PROG_CC 15 | 16 | LT_PREREQ([2.2]) 17 | LT_INIT 18 | 19 | # Common CFLAGS 20 | CFLAGS="$CFLAGS \ 21 | -fPIC \ 22 | -fstack-protector-all \ 23 | -fstrict-aliasing \ 24 | -pthread \ 25 | -Wall \ 26 | -Warray-bounds \ 27 | -Wextra \ 28 | -Wformat-nonliteral \ 29 | -Wformat-security \ 30 | -Wformat=2 \ 31 | -Winit-self \ 32 | -Wlarger-than=2097152 \ 33 | -Wmissing-declarations \ 34 | -Wmissing-format-attribute \ 35 | -Wmissing-include-dirs \ 36 | -Wmissing-noreturn \ 37 | -Wmissing-prototypes \ 38 | -Wnested-externs \ 39 | -Wold-style-definition \ 40 | -Wpacked \ 41 | -Wpointer-arith \ 42 | -Wsign-compare \ 43 | -Wstrict-prototypes \ 44 | -Wswitch-default \ 45 | -Wunused \ 46 | -Wno-unused-parameter \ 47 | -Wno-unused-result \ 48 | -Wwrite-strings \ 49 | -Werror=implicit-function-declaration" 50 | 51 | case "$CC" in 52 | *clang*) 53 | # Specific clang flags 54 | CFLAGS="$CFLAGS \ 55 | -Wno-initializer-overrides \ 56 | -Wno-missing-noreturn" 57 | ;; 58 | cc*) 59 | CFLAGS="$CFLAGS \ 60 | -Wno-cast-align \ 61 | -Wno-initializer-overrides" 62 | ;; 63 | *) 64 | # Specific gcc flags 65 | CFLAGS="$CFLAGS \ 66 | -Wno-override-init \ 67 | -Wunsafe-loop-optimizations \ 68 | -Wunused-but-set-variable" 69 | esac 70 | 71 | IMQUIC_VERSION_MAJOR=0 72 | AC_SUBST(IMQUIC_VERSION_MAJOR) 73 | IMQUIC_VERSION_MINOR=0 74 | AC_SUBST(IMQUIC_VERSION_MINOR) 75 | IMQUIC_VERSION_PATCH=1 76 | AC_SUBST(IMQUIC_VERSION_PATCH) 77 | IMQUIC_VERSION_STRING="0.0.1" 78 | AC_SUBST(IMQUIC_VERSION_STRING) 79 | IMQUIC_VERSION_RELEASE="alpha" 80 | AC_SUBST(IMQUIC_VERSION_RELEASE) 81 | IMQUIC_VERSION_SO="0:0:0" 82 | AC_SUBST(IMQUIC_VERSION_SO) 83 | 84 | glib_version=2.34 85 | 86 | AC_ARG_ENABLE([boringssl], 87 | [AS_HELP_STRING([--enable-boringssl], 88 | [Use BoringSSL instead of OpenSSL])], 89 | [ 90 | case "${enableval}" in 91 | yes) boringssl_dir=/opt/boringssl ;; 92 | no) boringssl_dir= ;; 93 | *) boringssl_dir=${enableval} ;; 94 | esac 95 | ], 96 | [boringssl_dir=]) 97 | 98 | PKG_CHECK_MODULES([IMQUIC],[ 99 | glib-2.0 >= $glib_version 100 | ]) 101 | 102 | IMQUIC_PACKAGES_PUBLIC="glib-2.0 >= $glib_version" 103 | IMQUIC_PACKAGES_PRIVATE="" 104 | 105 | IMQUIC_MANUAL_LIBS="${IMQUIC_MANUAL_LIBS} -lm" 106 | AC_SUBST(IMQUIC_MANUAL_LIBS) 107 | 108 | AS_IF([test "x${boringssl_dir}" != "x"], 109 | [echo "Trying to use BoringSSL instead of quictls..."; 110 | AC_MSG_NOTICE([BoringSSL directory is ${boringssl_dir}]) 111 | CFLAGS="$CFLAGS -I${boringssl_dir}/include"; 112 | BORINGSSL_CFLAGS="-I${boringssl_dir}/include"; 113 | AC_SUBST(BORINGSSL_CFLAGS) 114 | BORINGSSL_LIBS="-lstdc++ -L${boringssl_dir}/lib64 -lssl -lcrypto"; 115 | AC_SUBST(BORINGSSL_LIBS) 116 | AC_CHECK_HEADERS([${boringssl_dir}/include/openssl/opensslconf.h], 117 | [AC_DEFINE(IMQUIC_BORINGSSL)], 118 | [AC_MSG_ERROR([BoringSSL headers not found in ${boringssl_dir}])]) 119 | ], 120 | [ 121 | PKG_CHECK_MODULES([QUICTLS],[openssl+quictls]) 122 | ]) 123 | AM_CONDITIONAL([ENABLE_BORINGSSL], [test "x${boringssl_dir}" != "x"]) 124 | 125 | AC_ARG_ENABLE([qlog], 126 | [AS_HELP_STRING([--enable-qlog], 127 | [Enable QLOG support (requires Jansson)])], 128 | [], 129 | [enable_qlog=no]) 130 | AM_CONDITIONAL([ENABLE_QLOG], false) 131 | AS_IF([test "x$enable_qlog" != "xno"], 132 | [PKG_CHECK_MODULES([JANSSON], 133 | [jansson >= 2.5.0], 134 | [ 135 | AC_DEFINE(HAVE_QLOG) 136 | enable_qlog=yes 137 | AM_CONDITIONAL([ENABLE_QLOG], true) 138 | IMQUIC_PACKAGES_PRIVATE="jansson >= 2.5.0" 139 | ], 140 | [ 141 | AC_MSG_ERROR([Jansson headers not found])]) 142 | ]) 143 | 144 | AC_SUBST(IMQUIC_PACKAGES_PUBLIC) 145 | AC_SUBST(IMQUIC_PACKAGES_PRIVATE) 146 | 147 | ## 148 | # Examples 149 | ## 150 | 151 | AC_ARG_ENABLE([echo-examples], 152 | [AS_HELP_STRING([--enable-echo-examples], 153 | [Build the QUIC echo server and client examples])], 154 | [], 155 | [enable_echo_examples=no]) 156 | AM_CONDITIONAL([ENABLE_ECHO_EXAMPLES], [test "x$enable_echo_examples" = "xyes"]) 157 | 158 | AC_ARG_ENABLE([moq-examples], 159 | [AS_HELP_STRING([--enable-moq-examples], 160 | [Build the MoQ (Media Over QUIC) examples])], 161 | [], 162 | [enable_moq_examples=no]) 163 | AM_CONDITIONAL([ENABLE_MOQ_EXAMPLES], [test "x$enable_moq_examples" = "xyes"]) 164 | 165 | AC_ARG_ENABLE([roq-examples], 166 | [AS_HELP_STRING([--enable-roq-examples], 167 | [Build the RoQ (RTP Over QUIC) examples])], 168 | [], 169 | [enable_roq_examples=no]) 170 | AM_CONDITIONAL([ENABLE_ROQ_EXAMPLES], [test "x$enable_roq_examples" = "xyes"]) 171 | 172 | ## 173 | # Docs 174 | ## 175 | 176 | AC_ARG_ENABLE([docs], 177 | [AS_HELP_STRING([--enable-docs], 178 | [Enable building documentation])], 179 | [], 180 | [enable_docs=no]) 181 | 182 | AC_CHECK_PROG([DOXYGEN], 183 | [doxygen], 184 | [doxygen]) 185 | AC_CHECK_PROG([DOT], 186 | [dot], 187 | [dot]) 188 | AS_IF([test -z "$DOXYGEN" -o -z "$DOT"], 189 | [ 190 | AS_IF([test "x$enable_docs" = "xyes"], 191 | [AC_MSG_ERROR([doxygen or dot not found. See README.md for installation instructions or remove --enable-docs])]) 192 | ]) 193 | AM_CONDITIONAL([ENABLE_DOCS], [test "x$enable_docs" = "xyes"]) 194 | if test "x$enable_docs" = "xyes"; then 195 | doxygen_version=$($DOXYGEN --version) 196 | AS_VERSION_COMPARE([$doxygen_version], [1.8.11], 197 | [], 198 | [], 199 | [ 200 | AS_VERSION_COMPARE([$doxygen_version], [1.8.14], 201 | [AC_MSG_ERROR([Doxygen $doxygen_version not usable: versions between 1.8.12 and 1.8.14 are known to render poorly.])], 202 | [], 203 | [] 204 | ) 205 | ] 206 | ) 207 | fi 208 | 209 | AM_CONDITIONAL([WITH_SOURCE_DATE_EPOCH], [test "x$SOURCE_DATE_EPOCH" != "x"]) 210 | 211 | ## 212 | # Summary 213 | ## 214 | 215 | AC_CONFIG_FILES([ 216 | Makefile 217 | src/Makefile 218 | examples/Makefile 219 | docs/Makefile 220 | imquic.pc 221 | ]) 222 | 223 | AC_OUTPUT 224 | 225 | echo 226 | echo "Compiler: $CC" 227 | AM_COND_IF([ENABLE_BORINGSSL], 228 | [echo "Encryption: BoringSSL"], 229 | [echo "Encryption: quictls"]) 230 | AM_COND_IF([ENABLE_QLOG], 231 | [echo "QLOG Support: yes"], 232 | [echo "QLOG Support: no"]) 233 | AM_COND_IF([ENABLE_DOCS], 234 | [echo "Documentation: yes"], 235 | [echo "Documentation: no"]) 236 | echo 237 | echo "Examples:" 238 | AM_COND_IF([ENABLE_ECHO_EXAMPLES], 239 | [echo " -- Echo examples: yes"], 240 | [echo " -- Echo examples: no"]) 241 | AM_COND_IF([ENABLE_MOQ_EXAMPLES], 242 | [echo " -- MoQ examples: yes"], 243 | [echo " -- MoQ examples: no"]) 244 | AM_COND_IF([ENABLE_ROQ_EXAMPLES], 245 | [echo " -- RoQ examples: yes"], 246 | [echo " -- RoQ examples: no"]) 247 | 248 | echo 249 | echo "If this configuration is ok for you, do a 'make' to start building imquic. A 'make install' will install the library to the specified prefix." 250 | echo 251 | -------------------------------------------------------------------------------- /docs/Makefile.am: -------------------------------------------------------------------------------- 1 | if ENABLE_DOCS 2 | 3 | doxygendir = $(htmldir)/imquic-$(VERSION) 4 | 5 | EXTRA_DIST = html 6 | 7 | all: html-local 8 | 9 | html-local: 10 | mkdir -p html 11 | doxygen imquic.cfg 12 | doxygen imquic-api.cfg 13 | doxygen imquic-internal.cfg 14 | cp doxy-boot.js html/ 15 | mkdir -p html/css 16 | cp imquic.css html/css/ 17 | cp favicon.ico html/ 18 | cp meetecho-logo.png html/ 19 | 20 | install-data-local: html-local 21 | $(MKDIR_P) $(DESTDIR)$(doxygendir) 22 | cp -r html/ $(DESTDIR)$(doxygendir) 23 | 24 | uninstall-local: 25 | rm -rf $(DESTDIR)$(doxygendir) 26 | 27 | clean-local: 28 | rm -rf $(builddir)/html 29 | 30 | endif 31 | -------------------------------------------------------------------------------- /docs/doxy-boot.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | 3 | $("div.headertitle").addClass("pb-2 mt-4 mb-2 border-bottom"); 4 | $("div.title").addClass("h1"); 5 | 6 | $('li > a[href="index.html"] > span').before(" "); 7 | // $('li > a[href="index.html"] > span').text("CoActionOS"); 8 | $('li > a[href="modules.html"] > span').before(" "); 9 | $('li > a[href="namespaces.html"] > span').before(" "); 10 | $('li > a[href="annotated.html"] > span').before(" "); 11 | $('li > a[href="classes.html"] > span').before(" "); 12 | $('li > a[href="inherits.html"] > span').before(" "); 13 | $('li > a[href="functions.html"] > span').before(" "); 14 | $('li > a[href="functions_func.html"] > span').before(" "); 15 | $('li > a[href="functions_vars.html"] > span').before(" "); 16 | $('li > a[href="functions_enum.html"] > span').before(" "); 17 | $('li > a[href="functions_eval.html"] > span').before(" "); 18 | $('img[src="ftv2ns.png"]').replaceWith('N '); 19 | $('img[src="ftv2cl.png"]').replaceWith('C '); 20 | 21 | $("ul.tablist").addClass("nav nav-pills nav-fill"); 22 | $("ul.tablist").css("margin-top", "0.5em"); 23 | $("ul.tablist").css("margin-bottom", "0.5em"); 24 | $("ul.tablist > li").addClass("nav-item"); 25 | $("ul.tablist > li > a").addClass("nav-link"); 26 | $("li.current").children().addClass("active"); 27 | $("iframe").attr("scrolling", "yes"); 28 | 29 | $("#nav-path > ul").addClass("breadcrumb"); 30 | 31 | $("table.params").addClass("table"); 32 | $("div.ingroups").wrapInner(""); 33 | $("div.ingroups > small > a").addClass("text-muted"); 34 | $("div.levels").css("margin", "0.5em"); 35 | $("div.levels > span").addClass("btn btn-secondary btn-sm"); 36 | $("div.levels > span").css("margin-right", "0.25em"); 37 | 38 | $("table.directory").addClass("table table-striped"); 39 | $("div.summary > a").addClass("btn btn-secondary btn-sm"); 40 | $("table.fieldtable").addClass("table"); 41 | $(".fragment").addClass("card card-body bg-gray"); 42 | $(".memitem").addClass("card"); 43 | $(".memproto").addClass("card-header"); 44 | $(".memdoc").addClass("card-body"); 45 | $("span.mlabel").addClass("badge bg-info"); 46 | 47 | $("table.memberdecls").addClass("table"); 48 | $("[class^=memitem]").addClass("active"); 49 | 50 | $("div.ah").addClass("btn btn-secondary"); 51 | $("span.mlabels").addClass("pull-right"); 52 | $("table.mlabels").css("width", "100%") 53 | $("td.mlabels-right").addClass("pull-right"); 54 | 55 | $("div.ttc").addClass("card card-info"); 56 | $("div.ttname").addClass("card-header"); 57 | $("div.ttdef,div.ttdoc,div.ttdeci").addClass("card-body"); 58 | 59 | $('div.tabs').addClass('container card card-body bg-gray mb-3'); 60 | $('div.tabs2').addClass('container card card-body bg-gray mb-3'); 61 | $('div.tabs3').addClass('container card card-body bg-gray mb-3'); 62 | $('div.header').addClass('container'); 63 | $('div.contents').addClass('container'); 64 | $('div.groupHeader').addClass('alert-link').parent().parent().addClass('alert alert-info'); 65 | 66 | $('#MSearchBox').remove();//.parent().appendTo('#topmenu'); 67 | 68 | $('code').each(function() { $(this).html($(this).html().replace("–", "--")); } ); 69 | }); 70 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/meetecho/imquic/6c00455baba179ea04a428d2b5c6dc353aef77eb/docs/favicon.ico -------------------------------------------------------------------------------- /docs/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
12 | 13 | 14 | 18 | 19 |