Commit 503410fc authored by Pekka Pessi's avatar Pekka Pessi

Fixed problems in doxygen documentation and dist.

darcs-hash:20060215202133-65a35-cc1226bf839ec0d8dd39187d99e4829226c38e95.gz
parent ec341de4
......@@ -5,7 +5,7 @@ AUTOMAKE_OPTIONS = foreign
# note: order does matter in the subdir list
SUBDIRS = su features bnf sresolv sdp url msg sip stun ipt soa \
tport http nta nea iptsec nth nua
DIST_SUBDIRS = docs $(SUBDIRS)
DIST_SUBDIRS = $(SUBDIRS) docs
EXTRA_DIST = sofia.am
DOXYGEN = doxygen
......@@ -50,25 +50,26 @@ built-sources-recursive clean-built-sources-recursive $(COVERAGE_RECURSIVE):
done;
empty-doxytags:
@echo Generating empty doxytags ; \
@echo Generating empty doxytags
cd ${srcdir}; \
mkdir -p docs/html ; \
for d in $(DIST_SUBDIRS); do \
test -r $$d/Doxyfile || continue ; \
test -d docs/$$d || mkdir docs/$$d ; \
test -r docs/$$d/doxytags || \
echo '<?xml version="1.0"?>\
<tagfile />' > docs/$$d/doxytags ; \
if ! test -r docs/doxytags_$$d ; then \
echo '<?xml version="1.0"?>' > docs/doxytags_$$d ; \
echo '<tagfile />' >> docs/doxytags_$$d ; \
fi ; \
done
doxygen: built-sources empty-doxytags
@cd ${srcdir} ;\
for d in $(DIST_SUBDIRS); do \
test -r ${srcdir}/$$d/Doxyfile \
for d in $(DIST_SUBDIRS) $(DIST_SUBDIRS); do \
test -r $$d/Doxyfile \
&& pushd $$d > /dev/null \
&& echo running ${DOXYGEN} in $$d \
&& ${DOXYGEN} \
&& popd > /dev/null ; \
done ; \
done
cd ${srcdir}/docs/html && ../hide_emails.sh
.PHONY: built-sources built-sources-am empty-doxytags doxygen
PROJECT_NAME = "bnf"
OUTPUT_DIRECTORY = ../docs/html/bnf
INPUT = bnf.docs .
INPUT = bnf.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
......@@ -7,22 +7,22 @@ INPUT = mainpage.docs docguide.docs conformance.docs
@INCLUDE = ../docs/Doxyfile.conf
GENERATE_TAGFILE = ../docs/doxytags_docs
GENERATE_TAGFILE = doxytags_docs
TAGFILES =
TAGFILES += ../docs/doxytags_su=su
TAGFILES += ../docs/doxytags_ipt=ipt
TAGFILES += ../docs/doxytags_bnf=bnf
TAGFILES += ../docs/doxytags_url=url
TAGFILES += ../docs/doxytags_msg=msg
TAGFILES += ../docs/doxytags_sip=sip
TAGFILES += ../docs/doxytags_sresolv=sresolv
TAGFILES += ../docs/doxytags_stun=stun
TAGFILES += ../docs/doxytags_tport=tport
TAGFILES += ../docs/doxytags_nta=nta
TAGFILES += ../docs/doxytags_iptsec=iptsec
TAGFILES += ../docs/doxytags_sdp=sdp
TAGFILES += ../docs/doxytags_soa=soa
TAGFILES += ../docs/doxytags_nea=nea
TAGFILES += ../docs/doxytags_nua=nua
TAGFILES += ../docs/doxytags_features=features
TAGFILES =
TAGFILES += doxytags_su=su
TAGFILES += doxytags_ipt=ipt
TAGFILES += doxytags_bnf=bnf
TAGFILES += doxytags_url=url
TAGFILES += doxytags_msg=msg
TAGFILES += doxytags_sip=sip
TAGFILES += doxytags_sresolv=sresolv
TAGFILES += doxytags_stun=stun
TAGFILES += doxytags_tport=tport
TAGFILES += doxytags_nta=nta
TAGFILES += doxytags_iptsec=iptsec
TAGFILES += doxytags_sdp=sdp
TAGFILES += doxytags_soa=soa
TAGFILES += doxytags_nea=nea
TAGFILES += doxytags_nua=nua
TAGFILES += doxytags_features=features
......@@ -56,6 +56,7 @@ LATEX_BATCHMODE = YES
FILE_PATTERNS = *.h *.c
EXCLUDE_PATTERNS = acconfig.h config.h confdefs.h \
test*.h test*.c torture*.c *test.c *torture.c \
*_tag_dll.c *_tag_ref.c
IMAGE_PATH = ../docs/pictures
EXTRA_DIST = Doxyfile Doxyfile.aliases Doxyfile.conf \
docguide.docs \
mainpage.docs \
conformance.docs \
Doxyfile.version.in \
sofia-footer.html.in \
hide_emails.sh \
......
......@@ -7,7 +7,25 @@ for Sofia-SIP components. Some introductory material and
pointers to the example code are also included.
For a list of module specific pages, see @ref subdirs
"source tree structure".
"source tree structure" or direct links to submodules:<br>
<a href="nua/index.html">nua</a>
<a href="su/index.html">su</a>
<a href="features/index.html">features</a>
<a href="soa/index.html">soa</a>
<a href="sdp/index.html">sdp</a>
<a href="nta/index.html">nta</a>
<a href="tport/index.html">tport</a>
<a href="sresolv/index.html">sresolv</a>
<a href="sip/index.html">sip</a>
<a href="msg/index.html">msg</a>
<a href="url/index.html">url</a>
<a href="stun/index.html">stun</a>
<a href="iptsec/index.html">iptsec</a>
<a href="nea/index.html">nea</a>
<a href="nth/index.html">nth</a>
<a href="http/index.html">http</a>
<a href="bnf/index.html">bnf</a>
<a href="ipt/index.html">ipt</a>
@section who Contact Information
......@@ -34,21 +52,23 @@ Or post to the Sofia-SIP mailing list:
In libsofia-sip-ua, there are subdirectories
Terminal and high-level libraries utilizing for both signaling and media:
- <a href="nua/index.html">"nua" - SIP User Agent library</a>
- <a href="nea/index.html">"nea" - SIP Event API</a>
- <a href="iptsec/index.html">"iptsec" -
Digest authentication for HTTP and SIP</a>
Common runtime library:
- <a href="su/index.html">"su" - sockets, memory management, threads</a>
- <a href="sresolv/index.html">"sresolv" - Asynchronous DNS resolver</a>
- <a href="ipt/index.html">"ipt" - IPT utility library</a>
SIP Signaling:
- <a href="nua/index.html">"nua" - SIP User Agent library</a>
- <a href="nea/index.html">"nea" - SIP Event API</a>
- <a href="iptsec/index.html">"iptsec" -
Digest authentication for HTTP and SIP</a>
- <a href="nta/index.html">"nta" - SIP transaction engine</a>
- <a href="sresolv/index.html">"sresolv" - Asynchronous DNS resolver</a>
- <a href="tport/index.html">"tport" - Message transport</a>
- <a href="sip/index.html">"sip" - SIP messages and headers</a>
- <a href="msg/index.html">"msg" - Message handling </a>
- <a href="ipt/index.html">"ipt" - IPT utility library</a>
- <a href="url/index.html">"url" - URL handling</a>
- <a href="bnf/index.html">"url" - low level parsing</a>
HTTP subsystem:
- <a href="nth/index.html">"nth" - HTTP protocol engine</a>
......@@ -58,6 +78,12 @@ SDP processing:
- <a href="soa/index.html">"soa" - SDP Offer/Answer engine for SIP</a>
- <a href="sdp/index.html">"sdp" - SDP parser</a>
Other:
- <a href="stun/index.html">"stun" - STUN library</a>
Features provided by Sofia-SIP library:
- <a href="features/index.html">"features" - Features provided by Sofia SIP</a>
Documentation:
- "docs" - Doxygen reference documentation
......
PROJECT_NAME = "features"
OUTPUT_DIRECTORY = ../docs/html/features
INPUT = features.docs .
INPUT = features.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
TAGFILES += ../docs/docs/doxytags=../docs
TAGFILES += ../docs/su/doxytags=../su
TAGFILES += ../docs/ipt/doxytags=../ipt
TAGFILES += ../docs/bnf/doxytags=../bnf
TAGFILES += ../docs/url/doxytags=../url
TAGFILES += ../docs/msg/doxytags=../msg
TAGFILES += ../docs/sip/doxytags=../sip
TAGFILES += ../docs/sresolv/doxytags=../sresolv
TAGFILES += ../docs/tport/doxytags=../tport
TAGFILES += ../docs/nta/doxytags=../nta
TAGFILES += ../docs/sdp/doxytags=../sdp
TAGFILES += ../docs/doxytags_docs=..
TAGFILES += ../docs/doxytags_su=../su
TAGFILES += ../docs/doxytags_ipt=../ipt
TAGFILES += ../docs/doxytags_bnf=../bnf
TAGFILES += ../docs/doxytags_url=../url
TAGFILES += ../docs/doxytags_msg=../msg
TAGFILES += ../docs/doxytags_sip=../sip
TAGFILES += ../docs/doxytags_sresolv=../sresolv
TAGFILES += ../docs/doxytags_tport=../tport
TAGFILES += ../docs/doxytags_nta=../nta
TAGFILES += ../docs/doxytags_sdp=../sdp
GENERATE_TAGFILE = ../docs/doxytags_features
......
......@@ -22,7 +22,7 @@
*
*/
/**@file sofia_sip_features.c
/**@CFILE features.c
* Provide features available through the sofia-sip library.
*
* @author Pekka Pessi <Pekka.Pessi@nokia.com>
......@@ -41,11 +41,14 @@
/** The name and version of software package providing Sofia-SIP-UA library. */
char const * const sofia_sip_name_version = SOFIA_SIP_NAME_VERSION;
/** The name and version of software package providing S/MIME functionality. */
/** The name and version of software package providing S/MIME functionality,
* NULL if none.
*/
char const * const sofia_sip_has_smime = NULL;
/** The name and version of software package providing TLS functionality.
/** The name and version of software package providing TLS functionality,
* NULL if none.
*
* TLS over TCP is used as transport for SIP messages when using SIPS
* scheme. Using TLS over TCP with SIP is described in @RFC3261.
......@@ -56,14 +59,16 @@ char const * const sofia_sip_has_tls = tls_version;
char const * const sofia_sip_has_tls;
#endif
/** The name and version of software package providing DTLS functionality.
/** The name and version of software package providing DTLS functionality,
* NULL if none.
*
* DTLS or TLS over datagram transport (UDP) can be used as transport for
* SIP messages.
*/
char const * const sofia_sip_has_dtls;
/** The name and version of software package providing TLS over SCTP functionality.
/** The name and version of software package providing TLS over SCTP functionality,
* NULL if none.
*
* TLS over SCTP can be used as transport for SIP messages.
*/
......@@ -73,7 +78,8 @@ char const * const sofia_sip_has_tls_sctp;
#include <sigcomp.h>
#endif
/** The name and version of software package providing SigComp functionality.
/** The name and version of software package providing SigComp functionality,
* NULL if none.
*
* SigComp can be used to compress SIP messages.
*/
......@@ -83,7 +89,8 @@ char const * const sofia_sip_has_sigcomp = sigcomp_package_version;
char const * const sofia_sip_has_sigcomp;
#endif
/** The name and version of software package providing STUN functionality.
/** The name and version of software package providing STUN functionality,
* NULL if none.
*
* STUN is a protocol used to traverse NATs with UDP.
*/
......@@ -94,19 +101,22 @@ char const * const sofia_sip_has_stun = stun_version;
char const * const sofia_sip_has_stun;
#endif
/** The name and version of software package providing TURN functionality.
/** The name and version of software package providing TURN functionality,
* NULL if none.
*
* TURN is a protocol used to traverse NATs or firewalls with TCP or UDP.
*/
char const * const sofia_sip_has_turn;
/** The name and version of software package providing UPnP functionality.
/** The name and version of software package providing UPnP functionality,
* NULL if none.
*
* UPnP (Universal Plug and Play) can be used to traverse NATs or firewalls.
*/
char const * const sofia_sip_has_upnp;
/** The name and version of software package providing SCTP functionality.
/** The name and version of software package providing SCTP functionality,
* NULL if none.
*
* SCTP can be used as transport for SIP messages. The software providing it
* can be, for example, LKSCTP (Linux kernel SCTP) for Linux.
......@@ -114,7 +124,8 @@ char const * const sofia_sip_has_upnp;
char const * const sofia_sip_has_sctp;
/* We don't have viable SCTP transport interface */
/** The name and version of software package providing IPv6 functionality.
/** The name and version of software package providing IPv6 functionality,
* NULL if none.
*
* IPv6 can be used to send SIP messages.
*/
......
......@@ -5,7 +5,7 @@
@section features_meta Module Meta Information
The @b features module provides application information about the various
features possibly available through the sofia-sip-ua binary API.
features possibly available through the @ref subdirs "sofia-sip-ua" binary API.
@CONTACT Pekka Pessi <Pekka.Pessi@nokia.com>
......
......@@ -21,7 +21,7 @@
*
*/
/**@file sofia_sip_features.h
/**@file sofia-sip/features.h
* @brief Nokia User Agent Library Features
*
* @author Pekka Pessi <Pekka.Pessi@nokia.com>
......@@ -30,7 +30,7 @@
*/
#ifndef SOFIA_SIP_FEATURES_H
/** Defined when <sofia_sip_features.h> has been included. */
/** Defined when <sofia-sip/features.h> has been included. */
#define SOFIA_SIP_FEATURES_H
/** Define as current Sofia version */
......
PROJECT_NAME = "http"
OUTPUT_DIRECTORY = ../docs/html/http
INPUT = http.docs .
INPUT = http.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "ipt"
OUTPUT_DIRECTORY = ../docs/html/ips
INPUT = ipt.docs .
INPUT = ipt.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "iptsec"
OUTPUT_DIRECTORY = ../docs/html/iptsec
INPUT = iptsec.docs .
INPUT = iptsec.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "msg"
OUTPUT_DIRECTORY = ../docs/html/msg
INPUT = msg.docs .
INPUT = msg.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
......@@ -769,7 +769,7 @@ int msg_hostport_d(char **ss,
* no value for the name (in form "name" or "name=value"), the returned pointer
* points to a NUL character.
*
* @param params list (or vector) of parameters
* @param h pointer to header structure
* @param name parameter name (with or without "=" sign)
*
* @return
......@@ -876,7 +876,7 @@ int msg_header_replace_param(su_home_t *home,
* value. The "=" and value are ignored.
*
* @param h pointer to a header
* @param param parameter to be removed
* @param name name of parameter to be removed
*
* @retval 1 if a parameter was removed
* @retval 0 if no parameter was not removed
......
PROJECT_NAME = "nea"
OUTPUT_DIRECTORY = ../docs/html/nea
INPUT = nea.docs .
INPUT = nea.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "nta"
OUTPUT_DIRECTORY = ../docs/html/nta
INPUT = nta.docs .
INPUT = nta.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "nth"
OUTPUT_DIRECTORY = ../docs/html/nth
INPUT = nth.docs .
INPUT = nth.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "nua"
OUTPUT_DIRECTORY = ../docs/html/nua
INPUT = nua.docs .
INPUT = nua.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
......@@ -22,7 +22,7 @@
*
*/
/**@file nua.h @brief Nokia User Agent Library
/**@file sofia-sip/nua.h @brief Nokia User Agent Library
*
* @author Pekka Pessi <Pekka.Pessi@nokia.com>
*
......@@ -30,7 +30,7 @@
*/
#ifndef NUA_H
/** Defined when @b <nua.h> has been included. */
/** Defined when @b <sofia-sip/nua.h> has been included. */
#define NUA_H
#ifndef SU_WAIT_H
......
PROJECT_NAME = "sdp"
OUTPUT_DIRECTORY = ../docs/html/sdp
INPUT = sdp.docs .
INPUT = sdp.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "sip"
OUTPUT_DIRECTORY = ../docs/html/sip
INPUT = sip.docs .
INPUT = sip.docs sip_parser.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......@@ -17,6 +17,7 @@ GENERATE_TAGFILE = ../docs/doxytags_sip
ALIASES += \
"SIP_TAG=@ingroup sip_tag\n" \
"SIP_HEADER=@ingroup sip_headers\n@defgroup"
"SIP_HEADER=@ingroup sip_headers\n@defgroup" \
"SIP_PARSER=\n"
IMAGE_PATH += images
......@@ -37,14 +37,14 @@
*@code
/**@file sip_example.h.in
*
* Template for <sip_example.h>.
* Template for <sofia-sip/sip_example.h>.
*/
#ifndef SIP_EXAMPLE_H
/** Defined when <sip_example.h> has been included. */
/** Defined when <sofia-sip/sip_example.h> has been included. */
#define SIP_EXAMPLE_H
/**@file sip_example.h
/**@file sofia-sip/sip_example.h
*
* @brief Example header.
*
......
PROJECT_NAME = "soa"
OUTPUT_DIRECTORY = ../docs/html/soa
INPUT = soa.docs soa.h soa_add.h soa.c soa_tag.h soa_tag.c
INPUT = soa.docs sofia-sip/soa.h sofia-sip/soa_add.h soa.c
INPUT += sofia-sip/soa_tag.h soa_tag.c
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "sresolv"
OUTPUT_DIRECTORY = ../docs/html/sresolv
INPUT = sresolv.docs .
INPUT = sresolv.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
PROJECT_NAME = "stun"
OUTPUT_DIRECTORY = ../docs/html/stun
INPUT = stun.docs .
INPUT = stun.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
......@@ -58,6 +58,8 @@ torture_stun_LDFLAGS = -static
# ----------------------------------------------------------------------
# Install and distribution rules
EXTRA_DIST = Doxyfile stun.docs cert.pem key.pem rfc3489.txt
# ----------------------------------------------------------------------
# Sofia specific rules
......
PROJECT_NAME = "su"
OUTPUT_DIRECTORY = ../docs/html/su
INPUT = su.docs .
INPUT = su.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
......@@ -23,7 +23,7 @@
*/
/**
* @file su_memmem.c
* @file su_bm.c
* @brief Search with Boyer-Moore algorithm
*
* @author Pekka Pessi <Pekka.Pessi@nokia.com>
......
PROJECT_NAME = "tport"
OUTPUT_DIRECTORY = ../docs/html/tport
INPUT = tport.docs .
INPUT = tport.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
......@@ -38,7 +38,7 @@ endif
libtport_la_SOURCES = tport.c tport_tag.c tport_tag_ref.c $(USE_TLS_SRC)
# to make sure all files end up in the dist package
EXTRA_DIST = $(TLS_SRC)
EXTRA_libtport_la_SOURCES = $(TLS_SRC)
BUILT_SOURCES = tport_tag_ref.c
......@@ -57,7 +57,7 @@ test_tport_LDFLAGS = -static
# ----------------------------------------------------------------------
# Install and distribution rules
EXTRA_DIST += Doxyfile tport.docs \
EXTRA_DIST = Doxyfile tport.docs \
certificates.html agent.pem cafile.pem
# ----------------------------------------------------------------------
......
PROJECT_NAME = "url"
OUTPUT_DIRECTORY = ../docs/html/url
INPUT = url.docs .
INPUT = url.docs . sofia-sip
@INCLUDE = ../docs/Doxyfile.conf
......
......@@ -54,8 +54,8 @@ enum url_type_e {
url_im, /**< @c "im:" (simple instant messaging) */
url_pres, /**< @c "pres:" (simple presence) */
url_cid, /**< @c "cid:" (Content-ID) */
url_msrp, /**< @< "msrp:" (message session relay) */
url_wv, /**< @< "wv:" (Wireless village) */
url_msrp, /**< @c "msrp:" (message session relay) */
url_wv, /**< @c "wv:" (Wireless village) */
_url_none
};
......
......@@ -25,46 +25,54 @@ The formal URI syntax is defined in the
The URLs consist of a subset of printable ASCII (ECMA-5) characters. The
subset excludes space and characters commonly used as @e delimiters in
text-based protocols, such as "<" ">" "#" "%" and <"> (double quote), and so
called @e unwise characters whose positions are reserved for national
extensions in ECMA-5 (in US-ASCII, those characters are "{" "}" "|" "\" "^"
"[" "]" and "`").
text-based protocols, such as <b> < > # \% </b>and<b> " </b> (double
quote), and so called @e unwise characters whose positions are reserved for
national extensions in ECMA-5. In US-ASCII, those characters are:
<code><b>
{ } | \ ^ [ ] `
</b></code>
There are also nine characters that can have special syntactic meaning in
some parts of the URI. These @e reserved characters are used to separate
syntactical parts of the URLs from each other. The reserved characters are
as follows: ":" "@" "/" ";" "?" "&" "=" "+" and "$".
as follows: <b> : @ / ; ? & = + </b>and<b> $</b>.
The URL library understands two alternative URL syntaxes. First, the
basic syntax used by, e.g., @b ftp:, @b http: and @b rtsp: URLs:
<i>
scheme ":" ["//" [ user [":" password ] "@"] host [":" port ] ]
["/" path ] ["?" query ] ["#" fragment ]
</i>
<i>scheme</i> ":" ["//" [ <i>user</i> [":" <i>password</i> ] "@"]
<i>host</i> [":" <i>port</i> ] ]
["/" <i>path</i> ] ["?" <i>query</i> ] ["#" <i>fragment</i> ]
Alternatively, the syntax used by @b mailto:, @b sip:, @b im:, @b tel,
and @b pres: URLs:
<i>
scheme ":" [ [ user [":" password ] "@"] host [":" port ] ]
[";" params ] ["?" query ] ["#" fragment ]
</i>
<i>scheme</i> ":" [ [ <i>user</i> [":" <i>password</i> ] "@"]
<i>host</i> [":" <i>port</i> ] ] [";" <i>params</i> ] ["?" <i>query</i> ]
["#" <i>fragment</i> ]
Note that also "*" is a valid URL (with type url_any).
Note that also "*" is considered to be a valid URL (with type #url_any).
For example: \n
@code
http://example.org:7100/cgi-bin/query?key=90786
ftp://user:pass\@ftp.example.com/pub/
sip:user:pass\@example.com;user=ip
tel:+358718008000
@endcode
@subsection url_parsing Converting a String to url_t
The decoding function url_d() takes a string and splits it into parts as
shown above. The substrings are stored into the #url_t structure. When
decoding, the hex encoding using % is removed if the encoded character can
decoding, the hex encoding using \% is removed if the encoded character can
syntactically be part of the field. For instance, "%41" is decoded as
"A" in the user part, but "%40" (@) is left as is. (This is called
canonization of the URL fields.)
For example, when we parse the url below
@code
sip:pekka%2Epessi@nokia%2Ecom;method=%4D%45%53%53%41%47%45?body=CANNED%20MSG
sip:joe%2Euser@example%2Ecom;method=%4D%45%53%53%41%47%45?body=CANNED%20MSG
@endcode
the components are NUL-terminated, canonized and assigned to the structure
as follows:
......@@ -72,9 +80,9 @@ as follows:
url_type = url_sip
url_root = 0
url_scheme = "sip"
url_user = "pekka.pessi"
url_user = "joe.user"
url_password = NULL
url_host = "nokia.com"
url_host = "example.com"
url_port = NULL
url_path = NULL
url_params = "method=MESSAGE"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment