Files
ts-mobile-go/docs/teamspeak-sdk-3.5.2/doc/server/filetransfer.html
T
2026-07-20 19:01:03 +08:00

498 lines
51 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="../">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Filetransfer &mdash; TeamSpeak SDK documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=9edc463e" />
<script src="../_static/jquery.js?v=5d32c60e"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="../_static/documentation_options.js?v=7f41d439"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="FAQ" href="faq.html" />
<link rel="prev" title="Disabling protocol commands" href="disable-commands.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home">
TeamSpeak SDK
<img src="../_static/logo.png" class="logo" alt="Logo"/>
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../errors.html">TeamSpeak Error Codes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../properties.html">Property Enums</a></li>
<li class="toctree-l1"><a class="reference internal" href="../enumerations.html">Structures &amp; Enumerations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client_api.html">TeamSpeak Client Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="../server_api.html">TeamSpeak Server Functions</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Server</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="intro.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="basic.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="list-items.html">List available clients, channels, servers</a></li>
<li class="toctree-l1"><a class="reference internal" href="vserver-manage.html">Create and stop virtual servers</a></li>
<li class="toctree-l1"><a class="reference internal" href="advanced-create.html">Advanced virtual server creation</a></li>
<li class="toctree-l1"><a class="reference internal" href="info.html">Retrieve and store information</a></li>
<li class="toctree-l1"><a class="reference internal" href="channels.html">Managing channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="clients.html">Managing clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="whisper.html">Whisper lists</a></li>
<li class="toctree-l1"><a class="reference internal" href="encryption.html">Custom encryption</a></li>
<li class="toctree-l1"><a class="reference internal" href="passwords.html">Custom passwords</a></li>
<li class="toctree-l1"><a class="reference internal" href="permissions.html">Permission checks</a></li>
<li class="toctree-l1"><a class="reference internal" href="security-salt.html">Security salts and hashes</a></li>
<li class="toctree-l1"><a class="reference internal" href="disable-commands.html">Disabling protocol commands</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Filetransfer</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#enable-file-transfer">Enable file transfer</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#c.ts3server_enableFileManager"><code class="docutils literal notranslate"><span class="pre">ts3server_enableFileManager()</span></code></a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#callbacks">Callbacks</a></li>
<li class="toctree-l2"><a class="reference internal" href="#rewriting-the-path-on-the-server">Rewriting the path on the server</a></li>
<li class="toctree-l2"><a class="reference internal" href="#permissions">Permissions</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="faq.html">FAQ</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Client</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../client/intro.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/basic.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/connections.html">Managing server connections</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/logging.html">Logging</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/audio.html">Client Audio</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/wave-files.html">Playing wave files</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/3dsound.html">3D Sound</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/whisper.html">Whisper lists</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/voice-encryption.html">Channel voice data encryption</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/info.html">Retrieve and store information</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/channels.html">Channel Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/client-list.html">List clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/client-kick.html">Kicking clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/local-mute.html">Muting other clients</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/textmessages.html">Text chat</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/filetransfer.html">Filetransfer</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/encryption.html">Custom encryption</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/passwords.html">Custom passwords</a></li>
<li class="toctree-l1"><a class="reference internal" href="../client/faq.html">FAQ</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">TeamSpeak SDK</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Filetransfer</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="filetransfer">
<h1>Filetransfer<a class="headerlink" href="#filetransfer" title="Link to this heading"></a></h1>
<p>The TeamSpeak SDK includes the ability to support filetransfer, like the
regular TeamSpeak server and client offer. The server can function as a
file storage, which can be accessed by clients who can up- and download
files. Files are stored on the filesystem where the server is running.</p>
<section id="enable-file-transfer">
<h2>Enable file transfer<a class="headerlink" href="#enable-file-transfer" title="Link to this heading"></a></h2>
<p>The availability of filetransfer in the TeamSpeak server can be
controlled by the following function, which should be called right after
<a class="reference internal" href="basic.html#c.ts3server_initServerLib" title="ts3server_initServerLib"><code class="xref c c-func docutils literal notranslate"><span class="pre">ts3server_initServerLib()</span></code></a> to initialize filetransfer.</p>
<dl class="c function">
<dt class="sig sig-object c" id="c.ts3server_enableFileManager">
<span class="target" id="serverlib_8h_1a4f013fc7cccb234a34fdecf5081bdc3e"></span><span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">ts3server_enableFileManager</span></span></span><span class="sig-paren">(</span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">filebase</span></span>, <span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">ips</span></span>, <span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="n"><span class="pre">port</span></span>, <span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">downloadBandwidth</span></span>, <span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">uploadBandwidth</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.ts3server_enableFileManager" title="Link to this definition"></a><br /></dt>
<dd><p>Initialize the file transfer subsystem. Allows clients to store files on the machine the server is running on and download them. </p>
<p>If you want to support file transfer functionality, then call this function after calling <a class="reference internal" href="../server_api.html#serverlib_8h_1a4eb2277bdac2e16f0d0fa2620fa73ecd"><span class="std std-ref">ts3server_initServerLib</span></a> If you dont call this function file transfer features will not be available. The server library will create the directories necessary for storing files as needed, however directories will not be cleaned up by the server library. Instead it is the responsibility of the application to clean up these directories when theyre no longer needed (e.g. after a virtual server was deleted)</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>filebase</strong> path to where the server library will create necessary directories and store files uploaded by clients. </p></li>
<li><p><strong>ips</strong> zero terminated array of IP addresses to listen on for file transfer connections. IPv4 and IPv6 addresses are supported, do NOT pass host names. If set to 0, it will be treated as if you passed { “0.0.0.0”, “::”, 0 } </p></li>
<li><p><strong>port</strong> the TCP port to listen on for file transfer connections. </p></li>
<li><p><strong>downloadBandwidth</strong> limit in bytes per second which is available for downloading files from the server. Speed across all transfers will be limited to this number. Specify BANDWIDTH_LIMIT_UNLIMITED for no limit. </p></li>
<li><p><strong>uploadBandwidth</strong> limit in bytes per second which is available for uploading files to the server. Speed across all transfers will be limited to this number. Specify BANDWIDTH_LIMIT_UNLIMITED for no limit. </p></li>
</ul>
</dd>
<dt class="field-even">Returns<span class="colon">:</span></dt>
<dd class="field-even"><p>An Error code from the <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7b"><span class="std std-ref">Ts3ErrorType</span></a> enum indicating either success or the failure reason </p>
</dd>
</dl>
</dd></dl>
<p>The filebase directory will be created by the server lib. The individual
files will be in a sub directory of the filebase called virtualserver_x
where x is the id of the virtual server. Individual channel files will be
in a directory channel_y within their respective server directory
where y is the channel id of the channel.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>These directories will automatically be created by the server if
they do not exist. It is the responsibility of the application
(not serverlib) to delete these directories when they are no
longer needed.</p>
</div>
</section>
<section id="callbacks">
<h2>Callbacks<a class="headerlink" href="#callbacks" title="Link to this heading"></a></h2>
<p>The server lib notifies about ongoing file transfers by optionally
calling a defined callback, which is called everytime a file upload
or download has finished.</p>
<dl class="c struct">
<dt class="sig sig-object c">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">ServerLibFunctions</span></span></span><br /></dt>
<dd><p>Server callbacks. Zero initialize and set members to functions that are to be called when the event in question happens. Every callback you use should exit quickly to avoid stalling the server. If you need any expensive activity upon receiving callbacks, consider starting the activity in a new thread and allow the callback to exit quickly. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">onFileTransferEvent</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.FileTransferCallbackExport" title="FileTransferCallbackExport"><span class="n"><span class="pre">FileTransferCallbackExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called whenever a file transfer is done </p>
<dl class="field-list simple">
<dt class="field-odd">Param data<span class="colon">:</span></dt>
<dd class="field-odd"><p>pointer to a structure describing the file transfer that completed. See <a class="reference internal" href="../enumerations.html#struct_file_transfer_callback_export"><span class="std std-ref">FileTransferCallbackExport</span></a> for details. </p>
</dd>
</dl>
</dd></dl>
</div>
</dd></dl>
<dl class="c struct">
<dt class="sig sig-object c">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">FileTransferCallbackExport</span></span></span><br /></dt>
<dd><div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt class="sig sig-object c">
<span class="n"><span class="pre">anyID</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">clientID</span></span></span><br /></dt>
<dd><p>the client who started the file transfer </p>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="n"><span class="pre">anyID</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">transferID</span></span></span><br /></dt>
<dd><p>local identifier of the transfer that has completed </p>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="n"><span class="pre">anyID</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">remoteTransferID</span></span></span><br /></dt>
<dd><p>remote identifier of the transfer that has completed </p>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">status</span></span></span><br /></dt>
<dd><p>status of the transfer. One of the values from the <a class="reference internal" href="../enumerations.html#public__definitions_8h_1aead4d4dfd9de00d5daaeeff10189dc76"><span class="std std-ref">FileTransferState</span></a> enum </p>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="kt"><span class="pre">char</span></span><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">statusMessage</span></span></span><br /></dt>
<dd><p>utf8 encoded c string containing a human readable description of the status </p>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">remotefileSize</span></span></span><br /></dt>
<dd><p>size in bytes of the complete file to be transferred </p>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">bytes</span></span></span><br /></dt>
<dd><p>number of bytes transferred. Same as remotefileSize when the transfer completed entirely. </p>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">isSender</span></span></span><br /></dt>
<dd><p>boolean. 1 if the server is sending the file. 0 if the server is receiving the file. </p>
</dd></dl>
</div>
</dd></dl>
</section>
<section id="rewriting-the-path-on-the-server">
<h2>Rewriting the path on the server<a class="headerlink" href="#rewriting-the-path-on-the-server" title="Link to this heading"></a></h2>
<p id="s-rewrite-path">The SDK allows users to control where files are stored on the server as well
as the file name the files have on the server side file system.
The intended file name and path is already set in the parameters of this
callback when it is called.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This feature is optional. If you dont need to rewrite file system paths
or file names, simply do not implement this callback.</p>
</div>
<dl class="c struct">
<dt class="sig sig-object c">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">ServerLibFunctions</span></span></span><br /></dt>
<dd><p>Server callbacks. Zero initialize and set members to functions that are to be called when the event in question happens. Every callback you use should exit quickly to avoid stalling the server. If you need any expensive activity upon receiving callbacks, consider starting the activity in a new thread and allow the callback to exit quickly. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">onTransformFilePath</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="n"><span class="pre">anyID</span></span><span class="w"> </span><span class="n"><span class="pre">invokerClientID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.TransformFilePathExport" title="TransformFilePathExport"><span class="n"><span class="pre">TransformFilePathExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">original</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.TransformFilePathExportReturns" title="TransformFilePathExportReturns"><span class="n"><span class="pre">TransformFilePathExportReturns</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">result</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>Allows to rewrite the file path and name of the file to be transfered. Called when a transfer starts. </p>
<p>If you dont need to control server side file name and path then dont implement this callback. The parameters are already filled with the default values intended by the client starting the transfer. These can be changed as required. When the callback exits with <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> the transfer is started with the values present in the result struct. <p>See the <a class="reference internal" href="#s-rewrite-path"><span class="std std-ref">SDK documentation</span></a> for further details.</p>
</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Param invokerClientID<span class="colon">:</span></dt>
<dd class="field-even"><p>the client which started the file transfer </p>
</dd>
<dt class="field-odd">Param original<span class="colon">:</span></dt>
<dd class="field-odd"><p>the original file path and name desired by the client </p>
</dd>
<dt class="field-even">Param result<span class="colon">:</span></dt>
<dd class="field-even"><p>the values from this struct will be used by the server when the callback exits. Already filled with a copy of original. Change the values in this struct as needed. </p>
</dd>
<dt class="field-odd">Return<span class="colon">:</span></dt>
<dd class="field-odd"><p>a value from the <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7b"><span class="std std-ref">Ts3ErrorType</span></a> enum. Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to start the transfer with the values in the result struct. When returning an error code the file transfer is not started. </p>
</dd>
</dl>
</dd></dl>
</div>
</dd></dl>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>The length of the values present in the result <a class="reference internal" href="../enumerations.html#c.TransformFilePathExportReturns" title="TransformFilePathExportReturns"><code class="xref c c-struct docutils literal notranslate"><span class="pre">TransformFilePathExportReturns</span></code></a>
are limited and must not exceed the original length!</p>
</div>
</section>
<section id="permissions">
<h2>Permissions<a class="headerlink" href="#permissions" title="Link to this heading"></a></h2>
<p>The callbacks should return <a class="reference internal" href="../errors.html#c.Ts3ErrorType.ERROR_ok" title="ERROR_ok"><code class="xref c c-enumerator docutils literal notranslate"><span class="pre">ERROR_ok</span></code></a> to allow the action or
<code class="xref c c-enumerator docutils literal notranslate"><span class="pre">ERROR_permission</span></code> to deny it.</p>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>If a callback is not implemented, the action will be allowed by default.</p>
</div>
<dl class="c struct">
<dt class="sig sig-object c">
<span class="k"><span class="pre">struct</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">ServerLibFunctions</span></span></span><br /></dt>
<dd><p>Server callbacks. Zero initialize and set members to functions that are to be called when the event in question happens. Every callback you use should exit quickly to avoid stalling the server. If you need any expensive activity upon receiving callbacks, consider starting the activity in a new thread and allow the callback to exit quickly. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">permFileTransferInitUpload</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ClientMiniExport" title="ClientMiniExport"><span class="n"><span class="pre">ClientMiniExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ts3sc_ftinitupload" title="ts3sc_ftinitupload"><span class="n"><span class="pre">ts3sc_ftinitupload</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called when a file is to be uploaded. Allows you to deny a client from uploading files, files above a certain size, etc. </p>
<p>Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow the action, or <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to reject it.</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Param client<span class="colon">:</span></dt>
<dd class="field-even"><p>describes the client that attempts to upload the file. </p>
</dd>
<dt class="field-odd">Param params<span class="colon">:</span></dt>
<dd class="field-odd"><p>describes the file to be uploaded. </p>
</dd>
<dt class="field-even">Return<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow, <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to deny </p>
</dd>
</dl>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">permFileTransferInitDownload</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ClientMiniExport" title="ClientMiniExport"><span class="n"><span class="pre">ClientMiniExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ts3sc_ftinitdownload" title="ts3sc_ftinitdownload"><span class="n"><span class="pre">ts3sc_ftinitdownload</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called when a file is to be downloaded. Allows you to deny a client from downloading files, files above a certain size, etc. </p>
<p>Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow the action, or <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to reject it.</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Param client<span class="colon">:</span></dt>
<dd class="field-even"><p>describes the client that attempts to download the file </p>
</dd>
<dt class="field-odd">Param params<span class="colon">:</span></dt>
<dd class="field-odd"><p>describes the file to be downloaded. </p>
</dd>
<dt class="field-even">Return<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow, <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to deny </p>
</dd>
</dl>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">permFileTransferGetFileInfo</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ClientMiniExport" title="ClientMiniExport"><span class="n"><span class="pre">ClientMiniExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ts3sc_ftgetfileinfo" title="ts3sc_ftgetfileinfo"><span class="n"><span class="pre">ts3sc_ftgetfileinfo</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called when a client requests file information using <a class="reference internal" href="../client_api.html#clientlib_8h_1ae8c0b60065102c7010517b09769692af"><span class="std std-ref">ts3client_requestFileInfo</span></a>. Allows to deny clients from getting file information. </p>
<p>Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow the action, or <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to reject it.</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Param client<span class="colon">:</span></dt>
<dd class="field-even"><p>describes the client attempting to get information of the file. </p>
</dd>
<dt class="field-odd">Param params<span class="colon">:</span></dt>
<dd class="field-odd"><p>describes the file that information is requested for. </p>
</dd>
<dt class="field-even">Return<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow, <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to deny </p>
</dd>
</dl>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">permFileTransferGetFileList</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ClientMiniExport" title="ClientMiniExport"><span class="n"><span class="pre">ClientMiniExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ts3sc_ftgetfilelist" title="ts3sc_ftgetfilelist"><span class="n"><span class="pre">ts3sc_ftgetfilelist</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called when a client requests a directory listing using <a class="reference internal" href="../client_api.html#clientlib_8h_1a2f4af115935ecae757bdbcb8443de7db"><span class="std std-ref">ts3client_requestFileList</span></a>. Allows to deny listing files and directories in channels / directories. </p>
<p>Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow the action, or <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to reject it.</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Return<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow, <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to deny </p>
</dd>
</dl>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">permFileTransferDeleteFile</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ClientMiniExport" title="ClientMiniExport"><span class="n"><span class="pre">ClientMiniExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ts3sc_ftdeletefile" title="ts3sc_ftdeletefile"><span class="n"><span class="pre">ts3sc_ftdeletefile</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called when a client attempts to delete one or more files using <a class="reference internal" href="../client_api.html#clientlib_8h_1ad51a44944e06592bea370599ba282f44"><span class="std std-ref">ts3client_requestDeleteFile</span></a>. Allows denying clients deleting files. </p>
<p>Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow the action, or <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to reject it.</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Param client<span class="colon">:</span></dt>
<dd class="field-even"><p>describes the client attempting to delete the file </p>
</dd>
<dt class="field-odd">Param params<span class="colon">:</span></dt>
<dd class="field-odd"><p>describes the file to be deleted </p>
</dd>
<dt class="field-even">Return<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow, <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to deny </p>
</dd>
</dl>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">permFileTransferCreateDirectory</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ClientMiniExport" title="ClientMiniExport"><span class="n"><span class="pre">ClientMiniExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ts3sc_ftcreatedir" title="ts3sc_ftcreatedir"><span class="n"><span class="pre">ts3sc_ftcreatedir</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called when a directory is to be created using <a class="reference internal" href="../client_api.html#clientlib_8h_1af5c0dbb932a7f25b11d19602a4f70cf7"><span class="std std-ref">ts3client_requestCreateDirectory</span></a>. Allows to deny creating certain directories. </p>
<p>Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow the action, or <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to reject it.</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Param client<span class="colon">:</span></dt>
<dd class="field-even"><p>describes the client attempting to create the directory </p>
</dd>
<dt class="field-odd">Param params<span class="colon">:</span></dt>
<dd class="field-odd"><p>describes the directory to create. </p>
</dd>
<dt class="field-even">Return<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow, <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to deny </p>
</dd>
</dl>
</dd></dl>
<dl class="c var">
<dt class="sig sig-object c">
<span class="kt"><span class="pre">unsigned</span></span><span class="w"> </span><span class="kt"><span class="pre">int</span></span><span class="w"> </span><span class="p"><span class="pre">(</span></span><span class="p"><span class="pre">*</span></span><span class="sig-name descname"><span class="n"><span class="pre">permFileTransferRenameFile</span></span></span><span class="p"><span class="pre">)</span></span><span class="p"><span class="pre">(</span></span><span class="n"><span class="pre">uint64</span></span><span class="w"> </span><span class="n"><span class="pre">serverID</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ClientMiniExport" title="ClientMiniExport"><span class="n"><span class="pre">ClientMiniExport</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">client</span></span><span class="p"><span class="pre">,</span></span><span class="w"> </span><span class="k"><span class="pre">const</span></span><span class="w"> </span><span class="k"><span class="pre">struct</span></span><span class="w"> </span><a class="reference internal" href="../enumerations.html#c.ts3sc_ftrenamefile" title="ts3sc_ftrenamefile"><span class="n"><span class="pre">ts3sc_ftrenamefile</span></span></a><span class="w"> </span><span class="p"><span class="pre">*</span></span><span class="n"><span class="pre">params</span></span><span class="p"><span class="pre">)</span></span><br /></dt>
<dd><p>called when a file is to be renamed or moved using <a class="reference internal" href="../client_api.html#clientlib_8h_1ab13be97ad87ab9b10c38f75d5ad74c41"><span class="std std-ref">ts3client_requestRenameFile</span></a>. Allows to deny moving files or even renaming files. </p>
<p>Return <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow the action, or <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to reject it.</p>
<dl class="field-list simple">
<dt class="field-odd">Param serverID<span class="colon">:</span></dt>
<dd class="field-odd"><p>the server for which the callback was called </p>
</dd>
<dt class="field-even">Param client<span class="colon">:</span></dt>
<dd class="field-even"><p>describes the client attempting to rename or move the file. </p>
</dd>
<dt class="field-odd">Param params<span class="colon">:</span></dt>
<dd class="field-odd"><p>describes the file to be renamed or moved, and where the file should be moved to if its being moved. </p>
</dd>
<dt class="field-even">Return<span class="colon">:</span></dt>
<dd class="field-even"><p><a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7ba21e7fdf5a31623bfa8042865df880a9d"><span class="std std-ref">ERROR_ok</span></a> to allow, <a class="reference internal" href="../errors.html#public__errors_8h_1a0bcf1e0a5e32989890f6e85064327f7bacd0d64c660d7e6009b05bbba5631607d"><span class="std std-ref">ERROR_permissions</span></a> to deny </p>
</dd>
</dl>
</dd></dl>
</div>
</dd></dl>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="disable-commands.html" class="btn btn-neutral float-left" title="Disabling protocol commands" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="faq.html" class="btn btn-neutral float-right" title="FAQ" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2020, TeamSpeak Systems GmbH.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>