Liblinphone
3.11.1
|
Macros | |
#define | linphone_core_set_default_proxy(lc, config) linphone_core_set_default_proxy_config(lc, config) |
#define | linphone_proxy_config_expires linphone_proxy_config_set_expires |
#define | linphone_proxy_config_enableregister linphone_proxy_config_enable_register |
#define | linphone_proxy_config_get_addr linphone_proxy_config_get_server_addr |
Typedefs | |
typedef struct _LinphoneProxyConfig | LinphoneProxyConfig |
typedef enum _LinphoneRegistrationState | LinphoneRegistrationState |
Enumerations | |
enum | _LinphoneRegistrationState { LinphoneRegistrationNone, LinphoneRegistrationProgress, LinphoneRegistrationOk, LinphoneRegistrationCleared, LinphoneRegistrationFailed } |
User registration is controled by LinphoneProxyConfig settings.
Each LinphoneProxyConfig object can be configured with registration informations like proxy address , user id , refresh period , and so on.
A created proxy config using linphone_proxy_config_new(), once configured, must be added to LinphoneCore using function linphone_core_add_proxy_config().
It is recommended to set a default proxy config using function linphone_core_set_default_proxy(). Once done, if a proxy config has been configured with attribute enable register , next call to linphone_core_iterate() triggers a SIP register.
Registration status is reported by LinphoneCoreRegistrationStateChangedCb.
This pseudo code demonstrates basic registration operations:
Registration sate call back:
Authentication:
Most of the time, registration requires authentication to succeed. LinphoneAuthInfo info must be either added to LinphoneCore using function linphone_core_add_auth_info() before LinphoneProxyConfig is added to Linphone core, or on demand from call back LinphoneCoreAuthInfoRequestedCb.
Unregistration:
Unregistration or any changes to LinphoneProxyConfig must be first started by a call to function linphone_proxy_config_edit() and validated by function linphone_proxy_config_done()
This pseudo code shows how to unregister a user associated to a LinphoneProxyConfig
A complete tutorial can be found at : Registration tutorial
#define linphone_core_set_default_proxy | ( | lc, | |
config | |||
) | linphone_core_set_default_proxy_config(lc, config) |
typedef struct _LinphoneProxyConfig LinphoneProxyConfig |
The LinphoneProxyConfig object represents a proxy configuration to be used by the LinphoneCore object. Its fields must not be used directly in favour of the accessors methods. Once created and filled properly the LinphoneProxyConfig can be given to LinphoneCore with linphone_core_add_proxy_config(). This will automatically triggers the registration, if enabled.
The proxy configuration are persistent to restarts because they are saved in the configuration file. As a consequence, after linphone_core_new() there might already be a list of configured proxy that can be examined with linphone_core_get_proxy_config_list().
The default proxy (see linphone_core_set_default_proxy() ) is the one of the list that is used by default for calls.
typedef enum _LinphoneRegistrationState LinphoneRegistrationState |
LinphoneRegistrationState describes proxy registration states.
LinphoneRegistrationState describes proxy registration states.
int linphone_core_add_proxy_config | ( | LinphoneCore * | lc, |
LinphoneProxyConfig * | config | ||
) |
Add a proxy configuration. This will start registration on the proxy, if registration is enabled.
void linphone_core_clear_proxy_config | ( | LinphoneCore * | lc | ) |
Erase all proxies from config.
LinphoneProxyConfig* linphone_core_create_proxy_config | ( | LinphoneCore * | lc | ) |
Create a proxy config with default values from Linphone core.
[in] | lc | LinphoneCore object |
LINPHONE_DEPRECATED int linphone_core_get_default_proxy | ( | LinphoneCore * | lc, |
LinphoneProxyConfig ** | config | ||
) |
LinphoneProxyConfig* linphone_core_get_default_proxy_config | ( | LinphoneCore * | lc | ) |
[in] | lc | LinphoneCore object |
bool_t linphone_core_get_guess_hostname | ( | LinphoneCore * | lc | ) |
Returns TRUE if hostname part of primary contact is guessed automatically.
const char * linphone_core_get_identity | ( | LinphoneCore * | lc | ) |
Gets the default identity SIP address. This is an helper function. If no default proxy is set, this will return the primary contact ( see linphone_core_get_primary_contact() ). If a default proxy is set it returns the registered identity on the proxy.
[in] | lc | LinphoneCore object |
const char* linphone_core_get_primary_contact | ( | LinphoneCore * | lc | ) |
Returns the default identity when no proxy configuration is used.
LinphoneAddress* linphone_core_get_primary_contact_parsed | ( | LinphoneCore * | lc | ) |
Same as linphone_core_get_primary_contact() but the result is a LinphoneAddress object instead of const char*
const bctbx_list_t* linphone_core_get_proxy_config_list | ( | const LinphoneCore * | lc | ) |
Returns an unmodifiable list of entered proxy configurations.
[in] | lc | The LinphoneCore object |
void linphone_core_refresh_registers | ( | LinphoneCore * | lc | ) |
force registration refresh to be initiated upon next iterate
void linphone_core_remove_proxy_config | ( | LinphoneCore * | lc, |
LinphoneProxyConfig * | config | ||
) |
Removes a proxy configuration.
LinphoneCore will then automatically unregister and place the proxy configuration on a deleted list. For that reason, a removed proxy does NOT need to be freed.
void linphone_core_set_default_proxy_config | ( | LinphoneCore * | lc, |
LinphoneProxyConfig * | config | ||
) |
Sets the default proxy.
This default proxy must be part of the list of already entered LinphoneProxyConfig. Toggling it as default will make LinphoneCore use the identity associated with the proxy configuration in all incoming and outgoing calls.
[in] | lc | LinphoneCore object |
[in] | config | The proxy configuration to use as the default one. |
void linphone_core_set_guess_hostname | ( | LinphoneCore * | lc, |
bool_t | val | ||
) |
Tells LinphoneCore to guess local hostname automatically in primary contact.
int linphone_core_set_primary_contact | ( | LinphoneCore * | lc, |
const char * | contact | ||
) |
Sets the local "from" identity.
This data is used in absence of any proxy configuration or when no default proxy configuration is set. See LinphoneProxyConfig
bool_t linphone_proxy_config_avpf_enabled | ( | LinphoneProxyConfig * | cfg | ) |
Indicates whether AVPF/SAVPF is being used for calls using this proxy config.
[in] | cfg | LinphoneProxyConfig object. |
void linphone_proxy_config_destroy | ( | LinphoneProxyConfig * | cfg | ) |
Destroys a proxy config.
int linphone_proxy_config_done | ( | LinphoneProxyConfig * | cfg | ) |
Commits modification made to the proxy configuration.
void linphone_proxy_config_edit | ( | LinphoneProxyConfig * | cfg | ) |
Starts editing a proxy configuration.
Because proxy configuration must be consistent, applications MUST call linphone_proxy_config_edit() before doing any attempts to modify proxy configuration (such as identity, proxy address and so on). Once the modifications are done, then the application must call linphone_proxy_config_done() to commit the changes.
void linphone_proxy_config_enable_avpf | ( | LinphoneProxyConfig * | cfg, |
bool_t | enable | ||
) |
Indicates whether AVPF/SAVPF must be used for calls using this proxy config.
[in] | cfg | LinphoneProxyConfig object. |
[in] | enable | True to enable AVPF/SAVF, false to disable it. |
void linphone_proxy_config_enable_publish | ( | LinphoneProxyConfig * | cfg, |
bool_t | val | ||
) |
Indicates either or not, PUBLISH must be issued for this LinphoneProxyConfig .
In case this LinphoneProxyConfig has been added to LinphoneCore, follows the linphone_proxy_config_edit() rule.
[in] | cfg | LinphoneProxyConfig object. |
val | if true, publish will be engaged |
void linphone_proxy_config_enable_quality_reporting | ( | LinphoneProxyConfig * | cfg, |
bool_t | enable | ||
) |
Indicates whether quality statistics during call should be stored and sent to a collector according to RFC 6035.
[in] | cfg | LinphoneProxyConfig object. |
[in] | enable | True to sotre quality statistics and sent them to the collector, false to disable it. |
void linphone_proxy_config_enable_register | ( | LinphoneProxyConfig * | cfg, |
bool_t | val | ||
) |
Indicates either or not, REGISTRATION must be issued for this LinphoneProxyConfig .
In case this LinphoneProxyConfig has been added to LinphoneCore, follows the linphone_proxy_config_edit() rule.
[in] | cfg | LinphoneProxyConfig object. |
val | if true, registration will be engaged |
const LinphoneAuthInfo* linphone_proxy_config_find_auth_info | ( | const LinphoneProxyConfig * | cfg | ) |
Find authentication info matching proxy config, if any, similarly to linphone_core_find_auth_info.
[in] | cfg | LinphoneProxyConfig object. |
LinphoneAVPFMode linphone_proxy_config_get_avpf_mode | ( | const LinphoneProxyConfig * | cfg | ) |
Get enablement status of RTCP feedback (also known as AVPF profile).
[in] | cfg | LinphoneProxyConfig object. |
uint8_t linphone_proxy_config_get_avpf_rr_interval | ( | const LinphoneProxyConfig * | cfg | ) |
Get the interval between regular RTCP reports when using AVPF/SAVPF.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_contact_parameters | ( | const LinphoneProxyConfig * | cfg | ) |
const char* linphone_proxy_config_get_contact_uri_parameters | ( | const LinphoneProxyConfig * | cfg | ) |
LinphoneCore* linphone_proxy_config_get_core | ( | const LinphoneProxyConfig * | cfg | ) |
Get the LinphoneCore object to which is associated the LinphoneProxyConfig.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_custom_header | ( | LinphoneProxyConfig * | cfg, |
const char * | header_name | ||
) |
Obtain the value of a header sent by the server in last answer to REGISTER.
[in] | cfg | LinphoneProxyConfig object. |
header_name | the header name for which to fetch corresponding value |
bool_t linphone_proxy_config_get_dial_escape_plus | ( | const LinphoneProxyConfig * | cfg | ) |
const char* linphone_proxy_config_get_dial_prefix | ( | const LinphoneProxyConfig * | cfg | ) |
const char* linphone_proxy_config_get_domain | ( | const LinphoneProxyConfig * | cfg | ) |
Get the domain name of the given proxy config.
[in] | cfg | LinphoneProxyConfig object. |
LinphoneReason linphone_proxy_config_get_error | ( | const LinphoneProxyConfig * | cfg | ) |
Get the reason why registration failed when the proxy config state is LinphoneRegistrationFailed.
[in] | cfg | LinphoneProxyConfig object. |
const LinphoneErrorInfo* linphone_proxy_config_get_error_info | ( | const LinphoneProxyConfig * | cfg | ) |
Get detailed information why registration failed when the proxy config state is LinphoneRegistrationFailed.
[in] | cfg | LinphoneProxyConfig object. |
int linphone_proxy_config_get_expires | ( | const LinphoneProxyConfig * | cfg | ) |
const char* linphone_proxy_config_get_file_transfer_server | ( | const LinphoneProxyConfig * | cfg | ) |
Get the http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_identity | ( | const LinphoneProxyConfig * | cfg | ) |
const LinphoneAddress* linphone_proxy_config_get_identity_address | ( | const LinphoneProxyConfig * | cfg | ) |
LinphoneNatPolicy* linphone_proxy_config_get_nat_policy | ( | const LinphoneProxyConfig * | cfg | ) |
Get The policy that is used to pass through NATs/firewalls when using this proxy config. If it is set to NULL, the default NAT policy from the core will be used instead.
[in] | cfg | LinphoneProxyConfig object |
LinphonePrivacyMask linphone_proxy_config_get_privacy | ( | const LinphoneProxyConfig * | cfg | ) |
Get default privacy policy for all calls routed through this proxy.
[in] | cfg | LinphoneProxyConfig object. |
int linphone_proxy_config_get_publish_expires | ( | const LinphoneProxyConfig * | cfg | ) |
get the publish expiration time in second. Default value is the registration expiration value.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_quality_reporting_collector | ( | const LinphoneProxyConfig * | cfg | ) |
Get the route of the collector end-point when using quality reporting. This SIP address should be used on server-side to process packets directly before discarding packets. Collector address should be a non existing account and will not receive any messages. If NULL, reports will be send to the proxy domain.
[in] | cfg | LinphoneProxyConfig object. |
int linphone_proxy_config_get_quality_reporting_interval | ( | LinphoneProxyConfig * | cfg | ) |
Get the interval between interval reports when using quality reporting.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_realm | ( | const LinphoneProxyConfig * | cfg | ) |
Get the realm of the given proxy config.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_ref_key | ( | const LinphoneProxyConfig * | cfg | ) |
Get the persistent reference key associated to the proxy config.
The reference key can be for example an id to an external database. It is stored in the config file, thus can survive to process exits/restarts.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_route | ( | const LinphoneProxyConfig * | cfg | ) |
const char* linphone_proxy_config_get_server_addr | ( | const LinphoneProxyConfig * | cfg | ) |
LinphoneRegistrationState linphone_proxy_config_get_state | ( | const LinphoneProxyConfig * | cfg | ) |
Get the registration state of the given proxy config.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_proxy_config_get_transport | ( | const LinphoneProxyConfig * | cfg | ) |
Get the transport from either service route, route or addr.
[in] | cfg | LinphoneProxyConfig object. |
void* linphone_proxy_config_get_user_data | ( | const LinphoneProxyConfig * | cfg | ) |
Retrieve the user pointer associated with the proxy config.
[in] | cfg | LinphoneProxyConfig object. |
bool_t linphone_proxy_config_is_phone_number | ( | LinphoneProxyConfig * | proxy, |
const char * | username | ||
) |
Detect if the given input is a phone number or not.
proxy | LinphoneProxyConfig argument, unused yet but may contain useful data. Can be NULL. |
username | string to parse. |
bool_t linphone_proxy_config_is_registered | ( | const LinphoneProxyConfig * | cfg | ) |
LinphoneProxyConfig* linphone_proxy_config_new | ( | void | ) |
Creates an empty proxy config.
LINPHONE_DEPRECATED bool_t linphone_proxy_config_normalize_number | ( | LinphoneProxyConfig * | proxy, |
const char * | username, | ||
char * | result, | ||
size_t | result_len | ||
) |
See linphone_proxy_config_normalize_phone_number
proxy | LinphoneProxyConfig object containing country code and/or escape symbol. If NULL passed, will use default configuration. |
username | the string to parse |
result | the newly normalized number |
result_len | the size of the normalized number result |
char* linphone_proxy_config_normalize_phone_number | ( | LinphoneProxyConfig * | proxy, |
const char * | username | ||
) |
Normalize a human readable phone number into a basic string. 888-444-222 becomes 888444222 or +33888444222 depending on the LinphoneProxyConfig object. This function will always generate a normalized username if input is a phone number.
proxy | LinphoneProxyConfig object containing country code and/or escape symbol. If NULL passed, will use default configuration. |
username | the string to parse |
LinphoneAddress* linphone_proxy_config_normalize_sip_uri | ( | LinphoneProxyConfig * | proxy, |
const char * | username | ||
) |
Normalize a human readable sip uri into a fully qualified LinphoneAddress. A sip address should look like DisplayName <sip:username@domain:port> . Basically this function performs the following tasks
The result is a syntactically correct SIP address.
proxy | LinphoneProxyConfig object containing country code, escape symbol and/or domain name. Can be NULL if domain is already provided. |
username | the string to parse |
void linphone_proxy_config_pause_register | ( | LinphoneProxyConfig * | cfg | ) |
Prevent a proxy config from refreshing its registration. This is useful to let registrations to expire naturally (or) when the application wants to keep control on when refreshes are sent. However, linphone_core_set_network_reachable(lc,TRUE) will always request the proxy configs to refresh their registrations. The refreshing operations can be resumed with linphone_proxy_config_refresh_register().
[in] | cfg | LinphoneProxyConfig object. |
bool_t linphone_proxy_config_publish_enabled | ( | const LinphoneProxyConfig * | cfg | ) |
bool_t linphone_proxy_config_quality_reporting_enabled | ( | LinphoneProxyConfig * | cfg | ) |
Indicates whether quality statistics during call should be stored and sent to a collector according to RFC 6035.
[in] | cfg | LinphoneProxyConfig object. |
LinphoneProxyConfig* linphone_proxy_config_ref | ( | LinphoneProxyConfig * | cfg | ) |
Acquire a reference to the proxy config.
[in] | cfg | LinphoneProxyConfig object. |
void linphone_proxy_config_refresh_register | ( | LinphoneProxyConfig * | cfg | ) |
Refresh a proxy registration. This is useful if for example you resuming from suspend, thus IP address may have changed.
bool_t linphone_proxy_config_register_enabled | ( | const LinphoneProxyConfig * | cfg | ) |
void linphone_proxy_config_set_avpf_mode | ( | LinphoneProxyConfig * | cfg, |
LinphoneAVPFMode | mode | ||
) |
Enable the use of RTCP feedback (also known as AVPF profile).
[in] | cfg | LinphoneProxyConfig object. |
[in] | mode | the enablement mode, which can be LinphoneAVPFDefault (use LinphoneCore's mode), LinphoneAVPFEnabled (avpf is enabled), or LinphoneAVPFDisabled (disabled). |
void linphone_proxy_config_set_avpf_rr_interval | ( | LinphoneProxyConfig * | cfg, |
uint8_t | interval | ||
) |
Set the interval between regular RTCP reports when using AVPF/SAVPF.
[in] | cfg | LinphoneProxyConfig object. |
[in] | interval | The interval in seconds (between 0 and 5 seconds). |
void linphone_proxy_config_set_contact_parameters | ( | LinphoneProxyConfig * | cfg, |
const char * | contact_params | ||
) |
Set optional contact parameters that will be added to the contact information sent in the registration.
[in] | cfg | LinphoneProxyConfig object. |
contact_params | a string contaning the additional parameters in text form, like "myparam=something;myparam2=something_else" |
The main use case for this function is provide the proxy additional information regarding the user agent, like for example unique identifier or apple push id. As an example, the contact address in the SIP register sent will look like <sip:joe@1:50421>;apple-push-id=43143-DFE23F-2323-FA2232. 5.12 8.128 .93
void linphone_proxy_config_set_contact_uri_parameters | ( | LinphoneProxyConfig * | cfg, |
const char * | contact_uri_params | ||
) |
Set optional contact parameters that will be added to the contact information sent in the registration, inside the URI.
[in] | cfg | LinphoneProxyConfig object. |
contact_uri_params | a string containing the additional parameters in text form, like "myparam=something;myparam2=something_else" |
The main use case for this function is provide the proxy additional information regarding the user agent, like for example unique identifier or apple push id. As an example, the contact address in the SIP register sent will look like <sip:joe@1:50421;apple-push-id=43143-DFE23F-2323-FA2232>. 5.12 8.128 .93
void linphone_proxy_config_set_custom_header | ( | LinphoneProxyConfig * | cfg, |
const char * | header_name, | ||
const char * | header_value | ||
) |
Set the value of a custom header sent to the server in REGISTERs request.
[in] | cfg | LinphoneProxyConfig object. |
header_name | the header name | |
header_value | the header's value |
void linphone_proxy_config_set_dial_escape_plus | ( | LinphoneProxyConfig * | cfg, |
bool_t | val | ||
) |
Sets whether liblinphone should replace "+" by international calling prefix in dialed numbers (passed to linphone_core_invite ).
void linphone_proxy_config_set_dial_prefix | ( | LinphoneProxyConfig * | cfg, |
const char * | prefix | ||
) |
Sets a dialing prefix to be automatically prepended when inviting a number with linphone_core_invite(); This dialing prefix shall usually be the country code of the country where the user is living, without "+".
void linphone_proxy_config_set_expires | ( | LinphoneProxyConfig * | cfg, |
int | expires | ||
) |
Sets the registration expiration time in seconds.
void linphone_proxy_config_set_file_transfer_server | ( | LinphoneProxyConfig * | cfg, |
const char * | server_url | ||
) |
Set the http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml
[in] | cfg | LinphoneProxyConfig object. |
server_url | URL of the file server like https://file.linphone.org/upload.php |
int linphone_proxy_config_set_identity | ( | LinphoneProxyConfig * | cfg, |
const char * | identity | ||
) |
int linphone_proxy_config_set_identity_address | ( | LinphoneProxyConfig * | cfg, |
const LinphoneAddress * | identity | ||
) |
Sets the user identity as a SIP address.
This identity is normally formed with display name, username and domain, such as: Alice <sip:alice> The REGISTER messages will have from and to set to this identity. @exa mple. net
void linphone_proxy_config_set_nat_policy | ( | LinphoneProxyConfig * | cfg, |
LinphoneNatPolicy * | policy | ||
) |
Set the policy to use to pass through NATs/firewalls when using this proxy config. If it is set to NULL, the default NAT policy from the core will be used instead.
[in] | cfg | LinphoneProxyConfig object |
[in] | policy | LinphoneNatPolicy object |
void linphone_proxy_config_set_privacy | ( | LinphoneProxyConfig * | cfg, |
LinphonePrivacyMask | privacy | ||
) |
Set default privacy policy for all calls routed through this proxy.
[in] | cfg | LinphoneProxyConfig object. |
privacy | LinphonePrivacy to configure privacy |
void linphone_proxy_config_set_publish_expires | ( | LinphoneProxyConfig * | cfg, |
int | expires | ||
) |
Set the publish expiration time in second.
[in] | cfg | LinphoneProxyConfig object. |
expires | in second |
void linphone_proxy_config_set_quality_reporting_collector | ( | LinphoneProxyConfig * | cfg, |
const char * | collector | ||
) |
Set the route of the collector end-point when using quality reporting. This SIP address should be used on server-side to process packets directly before discarding packets. Collector address should be a non existing account and will not receive any messages. If NULL, reports will be send to the proxy domain.
[in] | cfg | LinphoneProxyConfig object. |
[in] | collector | route of the collector end-point, if NULL PUBLISH will be sent to the proxy domain. |
void linphone_proxy_config_set_quality_reporting_interval | ( | LinphoneProxyConfig * | cfg, |
int | interval | ||
) |
Set the interval between 2 interval reports sending when using quality reporting. If call exceed interval size, an interval report will be sent to the collector. On call termination, a session report will be sent for the remaining period. Value must be 0 (disabled) or positive.
[in] | cfg | LinphoneProxyConfig object. |
[in] | interval | The interval in seconds, 0 means interval reports are disabled. |
void linphone_proxy_config_set_realm | ( | LinphoneProxyConfig * | cfg, |
const char * | realm | ||
) |
Set the realm of the given proxy config.
[in] | cfg | LinphoneProxyConfig object. |
[in] | realm | New realm value. |
void linphone_proxy_config_set_ref_key | ( | LinphoneProxyConfig * | cfg, |
const char * | refkey | ||
) |
Associate a persistent reference key to the proxy config.
The reference key can be for example an id to an external database. It is stored in the config file, thus can survive to process exits/restarts.
[in] | cfg | LinphoneProxyConfig object. |
[in] | refkey | The reference key string to associate to the proxy config. |
int linphone_proxy_config_set_route | ( | LinphoneProxyConfig * | cfg, |
const char * | route | ||
) |
Sets a SIP route. When a route is set, all outgoing calls will go to the route's destination if this proxy is the default one (see linphone_core_set_default_proxy() ).
int linphone_proxy_config_set_server_addr | ( | LinphoneProxyConfig * | cfg, |
const char * | server_addr | ||
) |
Sets the proxy address
Examples of valid sip proxy address are:
void linphone_proxy_config_set_user_data | ( | LinphoneProxyConfig * | cfg, |
void * | ud | ||
) |
Assign a user pointer to the proxy config.
[in] | cfg | LinphoneProxyConfig object. |
[in] | ud | The user pointer to associate with the proxy config. |
void linphone_proxy_config_unref | ( | LinphoneProxyConfig * | cfg | ) |
Release reference to the proxy config.
[in] | cfg | LinphoneProxyConfig object. |
const char* linphone_registration_state_to_string | ( | LinphoneRegistrationState | cs | ) |
Human readable version of the LinphoneRegistrationState
cs | sate |