kopia lustrzana https://github.com/Hamlib/Hamlib
24 Sep 2001
Added Hamlib manual SGML source files to CVS. git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@665 7ae35d74-ebe9-4afe-98af-79ac388436b8Hamlib-1.1.3
rodzic
6b4830b02e
commit
f896e4e7ce
|
@ -0,0 +1,11 @@
|
|||
<chapter id="backend">
|
||||
<title>Writing a backend for hamlib</title>
|
||||
<para></para>
|
||||
</chapter>
|
||||
|
||||
<!--
|
||||
Local Variables:
|
||||
mode: sgml
|
||||
sgml-parent-document: ("hamlib.sgml" "book" "chapter")
|
||||
End:
|
||||
-->
|
|
@ -0,0 +1,87 @@
|
|||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
|
||||
<!ENTITY preface SYSTEM "preface.sgml">
|
||||
<!ENTITY intro SYSTEM "intro.sgml">
|
||||
<!ENTITY using SYSTEM "using.sgml">
|
||||
<!ENTITY reference SYSTEM "reference.sgml">
|
||||
<!ENTITY backend SYSTEM "backend.sgml">
|
||||
<!ENTITY internals SYSTEM "internals.sgml">
|
||||
<!ENTITY curver "1.1.0 (ALPHA)">
|
||||
]>
|
||||
<book>
|
||||
<bookinfo>
|
||||
<title>Ham Radio Control Libraries</title>
|
||||
<subtitle>API Reference for Version &curver;</subtitle>
|
||||
<author>
|
||||
<firstname>Nathan</firstname>
|
||||
<surname>Bargmann</surname>
|
||||
</author>
|
||||
<address>
|
||||
<email>n0nb@networksplus.net</email>
|
||||
</address>
|
||||
<pubdate>23 September 2001</pubdate>
|
||||
<copyright>
|
||||
<year>2000</year>
|
||||
<year>2001</year>
|
||||
<holder>Frank Singleton, VK3FCS & KM5WS; Stephane Fillod, F4CFE;
|
||||
Nate Bargmann, N0NB</holder>
|
||||
</copyright>
|
||||
<legalnotice id="legalnotice">
|
||||
<title>Hamlib-doc - Ham Radio Control Libraries Documentation</title>
|
||||
|
||||
<para>Copyright (C) 2000-2001 Stephane Fillod, Frank Singleton, Nate
|
||||
Bargmann. This documentation file is part of the Hamlib
|
||||
package.</para>
|
||||
|
||||
<para>Hamlib-doc is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.</para>
|
||||
|
||||
<para>Hamlib-doc is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.</para>
|
||||
|
||||
<para>You should have received a copy of the GNU General Public
|
||||
License along with Hamlib-doc; see the file COPYING. If not, write
|
||||
to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
|
||||
MA 02139, USA.</para>
|
||||
</legalnotice>
|
||||
<abstract>
|
||||
<title>Abstract</title>
|
||||
<para>Demonstrate the need for Hamlib, document the Hamlib API, provide
|
||||
an introduction to writing a program using Hamlib, and provide an
|
||||
introduction to authoring a backend library to control a radio or other
|
||||
device.</para>
|
||||
</abstract>
|
||||
<revhistory>
|
||||
<revision>
|
||||
<revnumber>0.1.1</revnumber>
|
||||
<date>23 September 2001</date>
|
||||
<authorinitials>nfb</authorinitials>
|
||||
<revremark>Final final draft for &curver;</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>0.1.0</revnumber>
|
||||
<date>24 February 2001</date>
|
||||
<authorinitials>nfb</authorinitials>
|
||||
<revremark>Final draft for &curver;</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>0.0.1</revnumber>
|
||||
<date>4 February 2001</date>
|
||||
<authorinitials>nfb</authorinitials>
|
||||
<revremark>Rough draft of Preface and Chapter 1. Posted on the
|
||||
Web for critique</revremark>
|
||||
</revision>
|
||||
</revhistory>
|
||||
</bookinfo>
|
||||
&preface;
|
||||
&intro;
|
||||
<!-- Comment out unstarted chapters for 1.1.0 (ALPHA) -->
|
||||
<!-- &using; -->
|
||||
&reference;
|
||||
<!-- &backend; -->
|
||||
<!-- &internals; -->
|
||||
</book>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
<chapter id="internals">
|
||||
<title>A Tour of hamlib</title>
|
||||
<para></para>
|
||||
</chapter>
|
||||
|
||||
<!--
|
||||
Local Variables:
|
||||
mode: sgml
|
||||
sgml-parent-document: ("hamlib.sgml" "book" "chapter")
|
||||
End:
|
||||
-->
|
|
@ -0,0 +1,293 @@
|
|||
<chapter id="intro">
|
||||
<title>Introduction to Hamlib</title>
|
||||
<para>When browsing through the owners manual of that new radio, the pages
|
||||
devoted to the computer commands seem like an afterthought. While the
|
||||
manufacturers are not interested in becoming software houses, they do
|
||||
adequately document the computer control capabilities which allow
|
||||
independent control software to be written. With the myriad possibilities
|
||||
of radios and manufacturers available, writing that ultimate logging or
|
||||
<acronym>PSK31</acronym> application can be a daunting task if even basic
|
||||
radio control support is desired. The Ham Radio Control Libraries project
|
||||
aims to develop a solution to this problem.</para>
|
||||
|
||||
<section id="overview">
|
||||
<title>Overview of Hamlib</title>
|
||||
<para>Hamlib itself is not an end-user application for radio
|
||||
control. Rather, it is a collection of libraries, both shared, or
|
||||
dynamic linked libraries, if you will, and static libraries that
|
||||
provide end-user applications with
|
||||
a common means of acessing and controlling radios (and perhaps other
|
||||
ham radio related peripheral devices in the future) directly connected
|
||||
to a computer or remotely over a network. Hamlib is currently being
|
||||
developed on the Linux operating system, but plans include it being
|
||||
usable on various flavors of <trademark>UNIX</trademark> and
|
||||
<trademark>Windows</trademark>, or whatever platform GNU autoconf
|
||||
will support.</para>
|
||||
|
||||
<para>Hamlib consists of several parts. The application programming
|
||||
interface, <acronym>API</acronym>, shared library is
|
||||
<filename>libhamlib-1.1.0.so</filename> which is installed in
|
||||
<filename class="directory">/usr/local/lib</filename> by default.
|
||||
For ease of use when linking,
|
||||
<filename class="symlink">libhamlib.so</filename> is provided as a
|
||||
symbolic link to the latest version of Hamlib installed. Of course,
|
||||
the installation directory may be changed by passing the proper
|
||||
option to the <command>configure</command> script in the base
|
||||
directory of the source distribution. While the static library is
|
||||
<filename>libhamlib.a</filename> and installed in <filename
|
||||
class="directory">/usr/local/lib</filename> as well.</para>
|
||||
|
||||
<para>The second main part of Hamlib consists of a number of
|
||||
"backend" libraries each able to communicate to a specific radio.
|
||||
For example, <filename>libhamlib-ft747.so</filename> is the shared
|
||||
backend library that provides Hamlib access to the Yaesu FT-747
|
||||
radio. By default the backend libraries are also installed in
|
||||
<filename class="directory">/usr/local/lib</filename>. Both shared
|
||||
and static libraries are provided by the default
|
||||
installation.</para>
|
||||
</section>
|
||||
|
||||
<section id="freesoftware">
|
||||
<title>Hamlib is Free Software</title>
|
||||
<para>The Hamlib libraries are Free
|
||||
Software licensed under the GNU Public License, <acronym>GPL</acronym>,
|
||||
version 2. It is important to be aware that use of Hamlib in a
|
||||
proprietary program has severe restrictions placed on it by the
|
||||
<acronym>GPL</acronym>. As a result one must carefully consider
|
||||
what kind of license to use for your program. Of course we
|
||||
encourage using the <acronym>GPL</acronym> for your program as it
|
||||
adds to the pool of available Free Software to the ham
|
||||
community.</para>
|
||||
|
||||
<para>The advantages of Free Software are multitude, but the primary ones
|
||||
include accessability of your code to others who can fix problems or
|
||||
add new functionality. Another advantage is that your code is
|
||||
always available to be studied by other experimenters and your code
|
||||
has a much lower chance of becoming dead bits that can't be used on
|
||||
newer operating systems. For an experimenter's hobby like ham
|
||||
radio, Free Software offers many more advantages than disadvantages
|
||||
to you and the ham community.</para>
|
||||
</section>
|
||||
|
||||
<section id="resources">
|
||||
<title>Hamlib development resources</title>
|
||||
<para>If you are interested in working on Hamlib development itself,
|
||||
there exist a few resources on the World Wide Web. The main project
|
||||
page is at <ulink url="http://sourceforge.net/projects/hamlib/">http://sourceforge.net/projects/hamlib/</ulink>.
|
||||
A homepage is currently in development at <ulink url="http://hamlib.sourceforge.net">http://hamlib.sourceforge.net</ulink>
|
||||
A development mailing list is hosted by <ulink url="http://sourceforge.net">http://sourceforge.net</ulink>. Subscription information and an archive
|
||||
can be accessed through the Hamlib project main page.</para>
|
||||
</section>
|
||||
|
||||
<section id="gettinghamlib">
|
||||
<title>Getting Hamlib</title>
|
||||
<para>At this time Hamlib is not included as a binary package in any
|
||||
major distribution that we're aware of (hopefully this will change
|
||||
soon). Until then you may retrieve the source from the Hamlib project
|
||||
page at <ulink
|
||||
url="http://sourceforge.net/projects/hamlib/">http://sourceforge.net/projects/hamlib/</ulink>.</para>
|
||||
|
||||
<section id="stablever">
|
||||
<title>Latest stable version</title>
|
||||
<para>The latest stable version is &curver;. Currently the project is
|
||||
in its early stages and only a few backend libraries are included.
|
||||
Hamlib is currently in heavy development.</para>
|
||||
</section>
|
||||
|
||||
<section id="develver">
|
||||
<title>Latest development version</title>
|
||||
<para>The latest development code is available via anonymous
|
||||
<acronym>CVS</acronym> through the
|
||||
<ulink url="http://sourceforge.net/projects/hamlib/">project
|
||||
page</ulink>.</para>
|
||||
|
||||
<section id="anonymouscvs">
|
||||
<title>Accessing anonymous CVS</title>
|
||||
<para>The following instructions are copied from the
|
||||
<ulink url="http://sourceforge.net">Sourceforge</ulink> website
|
||||
(modified with hamlib in the right places) and did work for me.</para>
|
||||
|
||||
<section id="anonymouscvsinstr">
|
||||
<title>Anonymous CVS instructions</title>
|
||||
<para>Hamlib's SourceForge CVS repository can be checked out through
|
||||
anonymous (pserver) CVS with the following instruction set. When
|
||||
prompted for a password for <emphasis>anonymous</emphasis>, simply
|
||||
press the <keycap>Enter</keycap> key.</para>
|
||||
|
||||
<screen format="linespecific">
|
||||
<prompt>myhost:~/src $</prompt> <command>cvs -d:pserver:anonymous@cvs.hamlib.\</command>
|
||||
<prompt>></prompt> <command>sourceforge.net:/cvsroot/hamlib login</command>
|
||||
<prompt>myhost:~/src $</prompt> <command>cvs -z3 -d:pserver:anonymous@cvs.hamlib.\</command>
|
||||
<prompt>></prompt> <command>sourceforge.net:/cvsroot/hamlib co hamlib</command>
|
||||
</screen>
|
||||
|
||||
<note><title>Working with long commandlines</title>
|
||||
<para>Long commands like those above are difficult to work with
|
||||
because once the line wraps the <literal>Bash(1)</literal> shell
|
||||
seems to start doing weird things. The trick is breaking the line
|
||||
into two (or more) parts with the <quote>\</quote> character.
|
||||
When the right edge of the screen is reached simply add
|
||||
<literal>\</literal> to the end of the text you are typing and
|
||||
then press
|
||||
<keycap>Enter</keycap>. You will receive a <prompt>></prompt>
|
||||
from <literal>Bash(1)</literal> and you may continue typing the
|
||||
command. If there is no space character in the command you are
|
||||
typing, be sure you don't add a space before the <literal>\</literal>
|
||||
or at the beginning of the next line. If you break the line where
|
||||
a space would exist in the command, either putting the space before
|
||||
the <literal>\</literal> or at the beginning of the next line.
|
||||
<literal>Bash(1)</literal> will splice the lines together to form one
|
||||
command once it receives a <keycap>Enter</keycap> character not
|
||||
preceded by a <literal>\</literal>.
|
||||
</note>
|
||||
|
||||
<para>Updates from within the hamlib directory do not need the
|
||||
<command>-d</command> parameter.</para>
|
||||
|
||||
<para>If you get the following error:</para>
|
||||
<literallayout>cvs login: failed to open /home/user/.cvspass for reading:
|
||||
No such file or directory
|
||||
cvs [login aborted]: fatal error: exiting
|
||||
</literallayout>
|
||||
<para>You can probably solve this by using the <command>touch</command>
|
||||
command to create the file <literal>.cvspass</literal> in your home
|
||||
directory:</para>
|
||||
|
||||
<screen>
|
||||
<prompt>myhost:~ $</prompt> <command>touch .cvspass</command>
|
||||
</screen>
|
||||
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="building">
|
||||
<title>Building Hamlib</title>
|
||||
<para>Building Hamlib from source isn't as daunting as it may seem
|
||||
at first, thanks to GNU <command>autoconf</command>, a tool used by
|
||||
the developers that generates the <command>configure</command>
|
||||
script found in the base directory of the source distribution.
|
||||
Running <command>configure</command> will test your system to be
|
||||
sure that any required packages for building Hamlib are present.
|
||||
While <command>configure</command> checks for many components, the
|
||||
only critical dependency is that the C library development header
|
||||
files are installed. Of course, you'll need a C compiler and its
|
||||
associated libraries.</para>
|
||||
|
||||
<section id="unpacking">
|
||||
<title>Unpacking the source archive</title>
|
||||
<para>While my favorite method of unpacking
|
||||
<filename>.tar.gz</filename> files is to use the Linux version of
|
||||
the Swiss Army Knife, Midnight Commander, the instructions
|
||||
provided are for using <command>tar</command> at the command
|
||||
prompt.</para>
|
||||
|
||||
<section id="tarunpack">
|
||||
<title>Using <command>tar</command> to extract the archive</title>
|
||||
<para>The first order of business is choosing a location for the
|
||||
source distribution. Some may choose to place the archive under
|
||||
<filename class="directory">/usr/local/src</filename>, or may
|
||||
prefer to work within their home directory. The disadvantage of
|
||||
working in <filename class="directory">/usr/local/src</filename>
|
||||
is that one must either be logged in as <literal>root</literal> or
|
||||
be a member of a group such as <literal>staff</literal> that has
|
||||
write permissions on the directory. The advantage of working in
|
||||
one's home directory is that writing and deleting files can be
|
||||
done with much lower risk of damage to the system areas of the
|
||||
filesystem. Either way, you will need to be logged in as
|
||||
<literal>root</literal> to install the libraries after compiling.
|
||||
On with unpacking the archive.</para>
|
||||
|
||||
<para>For this example I will make a few assumptions, the archive
|
||||
is downloaded and stored in <filename class="directory">~/Download</filename>
|
||||
and the source distribution will be installed in <filename class="directory">~/src</filename>.</para>
|
||||
|
||||
<note>
|
||||
<title>Interpreting <filename class="directory">~</filename></title>
|
||||
<para>If you are new to <trademark>UNIX</trademark> type
|
||||
systems, you may be puzzled just what <literal>~</literal>
|
||||
prepended to a path name means. It is simply a short hand for
|
||||
your home directory. If your user name is
|
||||
<literal>fred</literal>, then <literal>~</literal> refers to
|
||||
<filename class="directory">/home/fred</filename> on most
|
||||
systems, of course there are exceptions. If you are logged in
|
||||
as <literal>root</literal> then <literal>~</literal> refers to
|
||||
<filename class="directory">/root</filename>.</para>
|
||||
</note>
|
||||
|
||||
<para>The following sequence of commands will get the Hamlib
|
||||
archive to the right place (substitute your paths in the
|
||||
examples). First we'll move the archive into the directory where
|
||||
it will be extracted then use the tar command to extract the
|
||||
archive into its own directory.</para>
|
||||
|
||||
<screen format="linespecific">
|
||||
<prompt>myhost:~ $</prompt> <command>mv Download/hamlib-1.1.0.tar.gz src</command>
|
||||
<prompt>myhost:~ $</prompt> <command>cd src</command>
|
||||
<prompt>myhost:~/src $</prompt> <command>tar xvfz hamlib-1.1.0.tar.gz</command>
|
||||
</screen>
|
||||
|
||||
<para>Now you should have a directory called <filename class="directory">hamlib-1.1.0</filename>
|
||||
in the directory you executed the <command>tar</command> command.
|
||||
This would be a good time to familiarize yourself with the files in
|
||||
the archive.</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="compiling">
|
||||
<title>Compiling Hamlib</title>
|
||||
<para>Thanks to the clever design of GNU <literal>autoconf</literal>
|
||||
compiling Hamlib is as easy as running:</para>
|
||||
|
||||
<screen format="linespecific">
|
||||
<prompt>myhost:~/src/hamlib-1.1.0 $</prompt> <command>./configure</command>
|
||||
</screen>
|
||||
|
||||
<para>The <literal>configure</literal> script checks for the presence of
|
||||
the proper development files required to build Hamlib. After the checks
|
||||
<literal>configure</literal> then creates the Makefiles from the
|
||||
included templates in the archive. The next step is to compile
|
||||
Hamlib:</para>
|
||||
|
||||
<screen format="linespecific">
|
||||
<prompt>myhost:~/src/hamlib-1.1.0 $</prompt> <command>make</command>
|
||||
</screen>
|
||||
|
||||
<para>Now there should be considerable output to the screen during
|
||||
the compile process. The main thing here is to make sure that
|
||||
<command>gcc</command> doesn't fail while reporting an error. The most
|
||||
common failure is a message saying that a certain file cannot be
|
||||
found. Most likely the named file will have a <literal>.h</literal>
|
||||
extension which means the development files of a required library
|
||||
aren't installed on your system. As of this writing only the glibc
|
||||
development files are required.</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="summary">
|
||||
<title>Summary</title>
|
||||
<para>Hamlib is a tool for software authors wishing to take advantage of
|
||||
the computer control capabilities of modern transceivers and other
|
||||
devices used around the radio shack. When Hamlib reaches maturity
|
||||
it will likely be available in your favorite packaging format and
|
||||
manually compiling it won't be necessary unless you wish to customize
|
||||
Hamlib itself.</para>
|
||||
|
||||
<para>The remainder of this manual assumes a working knowledge of
|
||||
<trademark>UNIX</trademark> type systems. If you are new to Linux,
|
||||
I suggest getting a copy of Running Linux by O'Reilly and Associates
|
||||
from your local bookstore. You can preview this excellent reference
|
||||
on the Web at <ulink url="http://www.oreilly.com/catalog/runux3/">http://www.oreilly.com/catalog/runux3/</ulink>.
|
||||
</section>
|
||||
</chapter>
|
||||
|
||||
<!--
|
||||
Local Variables:
|
||||
mode: sgml
|
||||
sgml-parent-document: ("hamlib.sgml" "book" "chapter")
|
||||
End:
|
||||
-->
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
<preface id="preface">
|
||||
<title>Preface</title>
|
||||
<para>The Personal Computer has arguably become as prominent of a fixture
|
||||
in the modern hamshack as HF transceivers and handheld radios. The first
|
||||
PCs hams used combined with an interface also known as a terminal unit,
|
||||
<acronym>TU</acronym>, replaced the noisy mechanical radio teletype,
|
||||
<acronym>RTTY</acronym>, machines. Gradually, other uses became apparent
|
||||
for the hamshack PC such as logging contact information, operating newer
|
||||
digital modes such as <acronym>AMTOR</acronym>, a forward error correcting
|
||||
(<acronym>FEC</acronym>) mode of <acronym>RTTY</acronym>, and packet, an
|
||||
error checked way of transfering binary data between computers.</para>
|
||||
|
||||
<para>In the mid to late 1980s radio manufacturers began to offer computer
|
||||
control capability to their offerings. Now the shack PC had one more duty
|
||||
added to its repertoire. However, the amount of control over a given
|
||||
radio's capability by computer control was often much less than from the
|
||||
front panel. In large part was due to many analog controls on the front
|
||||
panel that weren't under control of the radio's <acronym>CPU</acronym>.
|
||||
Thus most radio control has been limited to control of frequency values
|
||||
of the variable frequency
|
||||
oscillators, <acronym>VFO</acronym>, and recalling and setting the radio's
|
||||
memory channels.</para>
|
||||
|
||||
<para>More recent models have more of the front panel controls under the
|
||||
supervision of the radio's <acronym>CPU</acronym>, consequently
|
||||
manufacturers have enabled more control of the radio's functions through
|
||||
the computer interface. This has created an explosion of command functions
|
||||
not just between the different manufacturers, but also among a given
|
||||
manufacturer's product line. There may also exist subtle differences in
|
||||
later versions of a given model.</para>
|
||||
|
||||
<para>For the software author wishing to incorporate even the most basic of
|
||||
radio control functions, the task is daunting. Even the long lived logging
|
||||
program <trademark>CT</trademark> by Ken Wolff, K1EA has reports of subtle
|
||||
bugs in one radio model or another (this is not intended as a knock of Ken
|
||||
or his effort, rather it is an observation of the complexity of supporting
|
||||
a multitude of radios in a monolithic program by one or a few authors). Is
|
||||
every programmer doomed to recreate radio control themselves with varying
|
||||
degrees of success? The answer is, no! </para>
|
||||
|
||||
<para>Enter the Hamlib project. Hamlib aims to provide application authors
|
||||
with a single application programming interface, <acronym>API</acronym>,
|
||||
regardless of the actual radio in use. Thus Hamlib is not an end user
|
||||
application, but is a middle software layer that acts as a translator
|
||||
between the <acronym>API</acronym> and the specific radio commands.</para>
|
||||
|
||||
<para>This manual will attempt to explain in detail the Hamlib <acronym>API
|
||||
</acronym>, how to use Hamlib for writing radio control software, how to
|
||||
write a radio backend library, and an overview of Hamlib's structure and
|
||||
design.</para>
|
||||
|
||||
<para>Finally, Hamlib is Free Software licensed under the GNU Public
|
||||
License, <acronym>GPL</acronym>, version 2. This will have certain
|
||||
implications if you are a software author considering using Hamlib as a
|
||||
part of your project. Consult the COPYING file in the base directory of
|
||||
the Hamlib source distribution for more details.</para>
|
||||
</preface>
|
||||
|
||||
<!--
|
||||
Local Variables:
|
||||
mode: sgml
|
||||
sgml-parent-document: ("hamlib.sgml" "book" "preface")
|
||||
End:
|
||||
-->
|
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,19 @@
|
|||
<chapter id="using">
|
||||
<title>Using the hamlib API</title>
|
||||
<para></para>
|
||||
<section id="languages">
|
||||
<title>Using Hamlib in your project</title>
|
||||
<para>Currently Hamlib only provides a C language interface,
|
||||
however, wrappers are planned for popular languages like C++, Perl,
|
||||
and Python in the future.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
</chapter>
|
||||
|
||||
<!--
|
||||
Local Variables:
|
||||
mode: sgml
|
||||
sgml-parent-document: ("hamlib.sgml" "book" "chapter")
|
||||
End:
|
||||
-->
|
Ładowanie…
Reference in New Issue