SipConfigurationAPI

Version 27 (Luci Stanescu, 03/16/2010 07:05 pm)

1 1 Adrian Georgescu
= Configuration API =
2 1 Adrian Georgescu
3 1 Adrian Georgescu
[[TOC(WikiStart, Sip*, depth=2)]]
4 1 Adrian Georgescu
5 25 Adrian Georgescu
The configuration API is used by the [wiki:SipMiddlewareApi Middleware API] to store and read its settings. By managing the settings of the middleware through this configuration API one can create different applications that behave consistently and inherit the same settings. For example a command line client or a GUI program can read and write their settings through this API. 
6 1 Adrian Georgescu
7 27 Luci Stanescu
The settings can be managed by API calls or by using the provided [wiki:sip_settings sip-settings] command line tool. The configuration API has appropriate defaults so that the middleware can function with a minimum amount of settings. To use the middleware, one must define at least one SIP account:
8 1 Adrian Georgescu
9 1 Adrian Georgescu
{{{
10 25 Adrian Georgescu
sip-settings --account add user@domain password
11 1 Adrian Georgescu
}}}
12 1 Adrian Georgescu
13 27 Luci Stanescu
== Middleware Settings Index ==
14 1 Adrian Georgescu
15 2 Adrian Georgescu
These are the current settings, kept in the modules '''sipsimple.configuration.settings''' and '''sipsimple.account'''. The main classes used to access the settings are Account, BonjourAccount and SIPSimpleSettings. All settings can be accessed as simple attributes. The types of attributes is described for each setting below. When setting the value of an attribute, if it's not of the required type, it will be given to the specified type as the only argument. The modified settings are not saved to the persistent storage until the '''save''' method is called on the main object. Once this is done, a CFGSettingsObjectDidChange notification is sent, the data of which is explained in [wiki:SipConfigurationAPI#SettingsObjectNotifications SettingsObject Notifications].
16 1 Adrian Georgescu
17 27 Luci Stanescu
Only a nillable setting can be assigned the value {{{None}}}, even if the type of the setting would otherwise accept {{{None}}} as an argument. The settings as described below are ''not'' nillable, unless specified explicitely. To reset the value of a setting, the special object {{{sipsimple.configuration.DefaultValue}}} can be assigned to it. If a default value is not explicitely specified below, it defaults to {{{None}}}. Note that a non-nillable setting cannot have the default value of {{{None}}}.
18 1 Adrian Georgescu
19 20 Adrian Georgescu
== General ==
20 5 Adrian Georgescu
21 7 Adrian Georgescu
{{{
22 23 Adrian Georgescu
SIP SIMPLE settings:
23 23 Adrian Georgescu
             +-- default_account = user@example.com
24 27 Luci Stanescu
SIP SIMPLE --|-- user_agent = sipsimple
25 4 Adrian Georgescu
             |-- audio
26 1 Adrian Georgescu
             |-- chat
27 4 Adrian Georgescu
             |-- desktop_sharing
28 4 Adrian Georgescu
             |-- file_transfer
29 1 Adrian Georgescu
             |-- logs
30 4 Adrian Georgescu
             |-- msrp
31 4 Adrian Georgescu
             |-- rtp
32 1 Adrian Georgescu
             |-- sip
33 1 Adrian Georgescu
             +-- tls
34 22 Adrian Georgescu
35 22 Adrian Georgescu
        +-- alert_device = system_default
36 27 Luci Stanescu
audio --|-- input_device = system_default
37 17 Adrian Georgescu
        |-- output_device = system_default
38 22 Adrian Georgescu
        |-- sample_rate = 44100
39 4 Adrian Georgescu
        |-- silent = False
40 22 Adrian Georgescu
        +-- tail_length = 200
41 1 Adrian Georgescu
42 1 Adrian Georgescu
       +
43 23 Adrian Georgescu
chat --|
44 17 Adrian Georgescu
       +
45 1 Adrian Georgescu
46 1 Adrian Georgescu
                  +
47 1 Adrian Georgescu
desktop_sharing --|
48 1 Adrian Georgescu
                  +
49 1 Adrian Georgescu
50 27 Luci Stanescu
                +
51 17 Adrian Georgescu
file_transfer --|
52 1 Adrian Georgescu
                +
53 1 Adrian Georgescu
54 27 Luci Stanescu
       +-- pjsip_level = 5
55 27 Luci Stanescu
logs --|
56 27 Luci Stanescu
       +
57 1 Adrian Georgescu
58 23 Adrian Georgescu
       +-- transport = tls
59 23 Adrian Georgescu
msrp --|
60 22 Adrian Georgescu
       +
61 17 Adrian Georgescu
62 17 Adrian Georgescu
      +-- audio_codec_list = AudioCodecList(['speex', 'G722', 'PCMU', 'PCMA', 'iLBC', 'GSM'])
63 22 Adrian Georgescu
rtp --|-- port_range = PortRange(start=50000, end=50400)
64 23 Adrian Georgescu
      +-- timeout = 30
65 23 Adrian Georgescu
66 23 Adrian Georgescu
      +-- tcp_port = 0
67 23 Adrian Georgescu
sip --|-- tls_port = 0
68 23 Adrian Georgescu
      |-- transport_list = SIPTransportList(['tls', 'tcp', 'udp'])
69 23 Adrian Georgescu
      +-- udp_port = 0
70 18 Adrian Georgescu
71 22 Adrian Georgescu
      +-- ca_list = None
72 18 Adrian Georgescu
tls --|-- protocol = TLSv1
73 17 Adrian Georgescu
      +-- timeout = 1000
74 22 Adrian Georgescu
75 4 Adrian Georgescu
}}}
76 1 Adrian Georgescu
77 1 Adrian Georgescu
The {{{sipsimple.configuration.settings.SIPSimpleSettings}}} class is a singleton can be instantiated and used anywhere after the [wiki:SipConfigurationAPI#ConfigurationManager ConfigurationManager] has been started. 
78 1 Adrian Georgescu
79 1 Adrian Georgescu
The settings are explained below:
80 2 Adrian Georgescu
81 1 Adrian Georgescu
 '''SIPSimpleSettings.default_account''' (type={{{str}}}, default={{{'bonjour@local'}}}, nillable={{{True}}})::
82 1 Adrian Georgescu
  A string, which contains the id of the default Account. This setting is managed by the AccountManager and should not be changed manually. See [wiki:SipMiddlewareApi#AccountManager AccountManager] for more information.
83 1 Adrian Georgescu
84 23 Adrian Georgescu
 '''SIPSimpleSettings.user_agent''' (type={{{str}}}, default={{{'sipsimple VERSION'}}})::
85 1 Adrian Georgescu
  This setting will be used to set the value of the User-Agent header in outgoing SIP requests and of the Server header in all SIP responses.
86 1 Adrian Georgescu
87 1 Adrian Georgescu
=== Audio ===
88 5 Adrian Georgescu
89 1 Adrian Georgescu
 '''SIPSimpleSettings.audio.input_device''' (type={{{str}}}, default={{{None}}}, nillable={{{True}}})::
90 1 Adrian Georgescu
  The name of the audio device, which will be used for input (recording). If it is set to {{{None}}}, one will be selected automatically by the operating system.
91 5 Adrian Georgescu
92 5 Adrian Georgescu
 '''SIPSimpleSettings.audio.output_device''' (type={{{str}}}, default={{{None}}}, nillable={{{True}}})::
93 1 Adrian Georgescu
  The name of the audio device, which will be used for output (playback). If it is set to {{{default}}, one will be selected automatically by the operating system.
94 1 Adrian Georgescu
95 1 Adrian Georgescu
 '''SIPSimpleSettings.audio.alert_device''' (type={{{str}}}, default={{{None}}}, nillable={{{True}}})::
96 1 Adrian Georgescu
  The name of the alert device, which will be used for alerting the user for incoming session request. If it is set to {{{default}}}, one will be selected automatically by the operating system.
97 24 Adrian Georgescu
98 1 Adrian Georgescu
 '''SIPSimpleSettings.audio.tail_length''' (type={{{NonNegativeInteger}}}, default={{{200}}})::
99 1 Adrian Georgescu
  This setting is used as a parameter for the audio echo cancellation algorithm. It's value is a non-negative integer which represents milliseconds. It specifies the length of the echo cancellation filter.
100 1 Adrian Georgescu
101 1 Adrian Georgescu
 '''SIPSimpleSettings.audio.sample_rate''' (type={{{SampleRate}}}, default={{{32}}})::
102 1 Adrian Georgescu
  This is the sample rate at which the audio system runs. All playback and recording will be done at this rate. If an audio codec has a smaller or larger sample rate, it will be resampled to this value. The possible values are 8, 16 and 32, and represent kHz.
103 1 Adrian Georgescu
 
104 1 Adrian Georgescu
 '''SIPSimpleSettings.audio.silent''' (type={{{bool}}}, default={{{False}}})::
105 1 Adrian Georgescu
  If this setting is set to True, no audio notifications will be played on the alert device.
106 17 Adrian Georgescu
107 1 Adrian Georgescu
=== Chat ===
108 1 Adrian Georgescu
109 23 Adrian Georgescu
Empty section for future use.
110 1 Adrian Georgescu
111 4 Adrian Georgescu
=== Desktop Sharing ===
112 24 Adrian Georgescu
113 1 Adrian Georgescu
Empty section for future use.
114 1 Adrian Georgescu
115 24 Adrian Georgescu
=== File Transfer ===
116 4 Adrian Georgescu
117 27 Luci Stanescu
Empty section for future use.
118 24 Adrian Georgescu
119 1 Adrian Georgescu
=== Logs ===
120 1 Adrian Georgescu
121 24 Adrian Georgescu
 '''SIPSimpleSettings.logs.pjsip_level''' (type={{{NonNegativeInteger}}}, default={{{5}}})::
122 5 Adrian Georgescu
  This setting controls the amount of log messages generated by the PJSIP core. It must be set to a non-negative integer.
123 1 Adrian Georgescu
124 23 Adrian Georgescu
=== MSRP ===
125 4 Adrian Georgescu
126 23 Adrian Georgescu
 '''SIPSimpleSettings.msrp.transport''' (type={{{MSRPTransport}}}, default={{{'tls'}}})::
127 23 Adrian Georgescu
  MSRP can use either TLS or TCP and this setting controls which one should be used.
128 1 Adrian Georgescu
129 23 Adrian Georgescu
=== RTP ===
130 1 Adrian Georgescu
131 23 Adrian Georgescu
 '''SIPSimpleSettings.rtp.port_range''' (type={{{PortRange}}}, default={{{PortRange(50000, 50400)}}})::
132 23 Adrian Georgescu
  This setting controls the port range from which ports used by RTP transport will be assigned. The values of the ports need to be in the range 1-65535; the start port must not be larger than the end port.
133 1 Adrian Georgescu
134 23 Adrian Georgescu
 '''SIPSimpleSettings.rtp.audio_codec_list''' (type={{{AudioCodecs}}}, default={{{('speex', 'G722', 'PCMU', 'PCMA', 'iLBC', 'GSM')}}})::
135 23 Adrian Georgescu
  This setting is used to specify the preferred audio codecs, which should be used for audio calls. It must be a tuple containing only strings, which represent the supported codecs (speex, g722, g711, ilbc and gsm), in the order in which they are preferred. This setting can be overridden per account.
136 1 Adrian Georgescu
137 23 Adrian Georgescu
=== SIP ===
138 1 Adrian Georgescu
139 23 Adrian Georgescu
 '''SIPSimpleSettings.sip.udp_port''' (type={{{Port}}}, default={{{0}}})::
140 23 Adrian Georgescu
  This is the port on which the Engine will bind and for for sending and receiving UDP packets. It is an integer in the range 0-65535. If it is set to 0, it will be allocated automatically.
141 23 Adrian Georgescu
142 23 Adrian Georgescu
 '''SIPSimpleSettings.sip.tcp_port''' (type={{{Port}}}, default={{{0}}})::
143 23 Adrian Georgescu
  This is the port on which the Engine will listen for TCP connections. It is an integer in the range 0-65535. If it is set to 0, it will be allocated automatically.
144 23 Adrian Georgescu
145 23 Adrian Georgescu
 '''SIPSimpleSettings.sip.tls_port''' (type={{{Port}}}, default={{{0}}})::
146 23 Adrian Georgescu
  This is the port on which the Engine will listen for TLS connections. It is an integer in the range 0-65535. If it is set to 0, it will be allocated automatically.
147 23 Adrian Georgescu
148 23 Adrian Georgescu
 '''SIPSimpleSettings.sip.transport_list''' (type={{{Transports}}}, default={{{('tls', 'tcp', 'udp')}}})::
149 23 Adrian Georgescu
  This setting's value is a tuple, which can only contain the strings 'tls', 'tcp' and 'udp'. It has a double purpose:
150 23 Adrian Georgescu
   * Only the transports specified here are used to SIP requests associated with normal accounts.
151 23 Adrian Georgescu
   * The order of the transports specified in this tuple represent the preferred order in which transports should be used. This applies to all SIP requests.
152 23 Adrian Georgescu
153 23 Adrian Georgescu
=== TLS ===
154 23 Adrian Georgescu
155 23 Adrian Georgescu
 '''SIPSimpleSettings.tls.ca_list''' (type={{{DataPath}}}, default={{{None}}}, nillable={{{True}}})::
156 24 Adrian Georgescu
  The settings points to a file which contains the CA certificates. In can be {{{None}}}, in which case no CAs are available. If it is set to relative path, it is taken relative to {{{SIPSimpleSettings.user_data_directory}}}; otherwise it is interpreted as an absolute path. In order to access the full path to the history directory, the value attribute on the setting can be used:
157 23 Adrian Georgescu
  {{{
158 1 Adrian Georgescu
  SIPSimpleSettings().tls.ca_list.value
159 23 Adrian Georgescu
  }}}
160 23 Adrian Georgescu
161 24 Adrian Georgescu
 '''SIPSimpleSettings.tls.protocol''' (type={{{TLSProtocol}}}, default={{{'TLSv1'}}})::
162 23 Adrian Georgescu
  This setting sets the version of the TLS protocol which will be used. It is a string and must be one of {{{'TLSv1'}}}, {{{'SSLv2'}}}, {{{'SSL3'}}}, {{{'SSL23'}}}.
163 23 Adrian Georgescu
164 24 Adrian Georgescu
 '''SIPSimpleSettings.tls.timeout''' (type={{{NonNegativeInteger}}}, default={{{1000}}})::
165 1 Adrian Georgescu
  This is the timeout for negotiating TLS connections, in milliseconds. It must be an non-negative integer.
166 1 Adrian Georgescu
167 1 Adrian Georgescu
== Account ==
168 1 Adrian Georgescu
169 22 Adrian Georgescu
{{{
170 24 Adrian Georgescu
Account user@example.com:
171 22 Adrian Georgescu
          +-- display_name = Example User
172 8 Adrian Georgescu
account --|-- enabled = True
173 1 Adrian Georgescu
          |-- password = xyz
174 1 Adrian Georgescu
          |-- dialog_event
175 1 Adrian Georgescu
          |-- message_summary
176 1 Adrian Georgescu
          |-- nat_traversal
177 24 Adrian Georgescu
          |-- presence
178 1 Adrian Georgescu
          |-- pstn
179 1 Adrian Georgescu
          |-- rtp
180 22 Adrian Georgescu
          |-- sip
181 22 Adrian Georgescu
          |-- tls
182 1 Adrian Georgescu
          +-- xcap
183 8 Adrian Georgescu
184 24 Adrian Georgescu
               +-- enabled = True
185 24 Adrian Georgescu
dialog_event --|
186 24 Adrian Georgescu
               +
187 22 Adrian Georgescu
188 22 Adrian Georgescu
                  +-- enabled = True
189 8 Adrian Georgescu
message_summary --|-- voicemail_uri = None
190 8 Adrian Georgescu
                  +
191 8 Adrian Georgescu
192 24 Adrian Georgescu
                +-- msrp_relay = None
193 24 Adrian Georgescu
nat_traversal --|-- stun_server_list = None
194 24 Adrian Georgescu
                |-- use_ice = False
195 1 Adrian Georgescu
                |-- use_msrp_relay_for_inbound = True
196 1 Adrian Georgescu
                +-- use_msrp_relay_for_outbound = False
197 1 Adrian Georgescu
198 24 Adrian Georgescu
           +-- enabled = True
199 24 Adrian Georgescu
presence --|-- use_rls = True
200 24 Adrian Georgescu
           +
201 8 Adrian Georgescu
202 24 Adrian Georgescu
       +
203 24 Adrian Georgescu
pstn --|
204 24 Adrian Georgescu
       +
205 24 Adrian Georgescu
206 22 Adrian Georgescu
      +-- audio_codec_list = None
207 1 Adrian Georgescu
rtp --|-- inband_dtmf = False
208 24 Adrian Georgescu
      |-- srtp_encryption = optional
209 24 Adrian Georgescu
      +-- use_srtp_without_tls = False
210 24 Adrian Georgescu
211 1 Adrian Georgescu
      +-- outbound_proxy = SIPProxyAddress('sip.example.com', port=5060, transport='udp')
212 1 Adrian Georgescu
sip --|-- publish_interval = 600
213 1 Adrian Georgescu
      |-- register = True
214 24 Adrian Georgescu
      |-- register_interval = 600
215 1 Adrian Georgescu
      +-- subscribe_interval = 600
216 1 Adrian Georgescu
217 1 Adrian Georgescu
218 24 Adrian Georgescu
      +-- certificate = tls/user@example.com.crt
219 1 Adrian Georgescu
tls --|-- verify_server = False
220 1 Adrian Georgescu
      +
221 1 Adrian Georgescu
222 8 Adrian Georgescu
       +-- enabled = True
223 24 Adrian Georgescu
xcap --|-- use_xcap_diff = True
224 1 Adrian Georgescu
       +-- xcap_root = https://xcap.example.com/xcap-root/
225 1 Adrian Georgescu
}}}
226 1 Adrian Georgescu
227 1 Adrian Georgescu
The Account object is used to represent a normal SIP account registered at a SIP provider. It is uniquely identifiable by it's SIP ID, in the form ''user@domain''. There is exactly one instance of Account per ID, which means that an Account can be accessed by instantianting it anywhere. However, this is not the recommended way of accessing accounts, since it can lead to creating new accounts. The recommended way is by using the [wiki:SipMiddlewareApi#AccountManager AccountManager]. Information about the roles of Account, apart from being a collection of settings, is explained in the [wiki:SipMiddlewareApi#Account Middleware API]. 
228 1 Adrian Georgescu
229 1 Adrian Georgescu
The settings that can be accessed on an Account are described below:
230 1 Adrian Georgescu
231 1 Adrian Georgescu
 '''Account.id''' (type={{{SIPAddress}}})::
232 1 Adrian Georgescu
  This is not a setting, as it cannot be modified. It's type is a subclass of {{{str}}}, so it can be used as a normal string, however it also has two attributes {{{username}}} and {{{domain}}} which point to the specific parts of the SIP address.
233 1 Adrian Georgescu
234 24 Adrian Georgescu
 '''Account.display_name''' (type={{{str}}}, default={{{None}}}, nillable={{{True}}})::
235 24 Adrian Georgescu
  The contents of this setting will be sent as part of the ''From'' header when sending SIP requests.
236 24 Adrian Georgescu
237 1 Adrian Georgescu
 '''Account.enabled''' (type={{{bool}}}, default={{{False}}})::
238 1 Adrian Georgescu
  If this setting is set to {{{True}}}, the Account will automatically activate and can be used in other parts of the middleware. More about this is described in [wiki:SipMiddlewareApi#Account Account].
239 1 Adrian Georgescu
240 1 Adrian Georgescu
 '''Account.password''' (type={{{str}}}, default={{{''}}})::
241 1 Adrian Georgescu
  The password, which will be used with this account for authentication.
242 1 Adrian Georgescu
243 1 Adrian Georgescu
244 24 Adrian Georgescu
=== Dialog Event ===
245 1 Adrian Georgescu
246 24 Adrian Georgescu
 '''Account.dialog_event.enabled''' (type={{{bool}}}, default={{{True}}})::
247 24 Adrian Georgescu
  If this setting is set to {{{True}}}, the Account will subscribe to the ''dialog'' event as specified by RFC4235.
248 1 Adrian Georgescu
249 24 Adrian Georgescu
=== Message Summary ===
250 1 Adrian Georgescu
251 24 Adrian Georgescu
 '''Account.message_summary.enabled''' (type={{{bool}}}, default={{{False}}})::
252 24 Adrian Georgescu
  If this setting is set to {{{True}}}, the Account will subscribe to the ''message-summary'' event, as specified by RFC3842.
253 8 Adrian Georgescu
254 24 Adrian Georgescu
 '''Account.message_summary.voicemail_uri''' (type={{{str}}}, default={{{None}}}, nillable={{{True}}})::
255 24 Adrian Georgescu
  This is the SIP URI which can be called to listen to the voicemail messages.
256 22 Adrian Georgescu
257 1 Adrian Georgescu
=== NAT Traversal ===
258 22 Adrian Georgescu
259 24 Adrian Georgescu
 '''Account.nat_traversal.use_ice''' (type={{{bool}}}, default={{{False}}})::
260 24 Adrian Georgescu
  If this setting is set to {{{True}}}, ICE will be used for finding media candidates for communication over NAT-ed networks.
261 1 Adrian Georgescu
262 24 Adrian Georgescu
 '''Account.nat_traversal.stun_server_list''' (type={{{StunServerAddresses}}}, default={{{None}}}, nillable={{{True}}})::
263 25 Adrian Georgescu
  This setting used for NAT traversal can be used to specify the addresses of the STUN servers used for detecting server reflexive candidates in the context of ICE. The value of the setting is a tuple of objects of type {{{StunServerAddress}}}. If None, the servers will be looked up in the DNS (SRV record _stun._udp.domain).
264 22 Adrian Georgescu
265 22 Adrian Georgescu
 '''Account.nat_traversal.msrp_relay''' (type={{{MSRPRelayAddress}}}, default={{{None}}}, nillable={{{True}}})::
266 25 Adrian Georgescu
  This setting can be used to specify a MSRP relay for use in MSRP connections. If it is set to {{{None}}}. If None, the servers will be looked up in the DNS (SRV record _msrps._tcp.domain).
267 22 Adrian Georgescu
268 22 Adrian Georgescu
 '''Account.nat_traversal.use_msrp_relay_for_inbound''' (type={{{bool}}}, default={{{True}}})::
269 22 Adrian Georgescu
  If this setting is set to {{{True}}}, the MSRP relay will be used for all incoming MSRP connections.
270 22 Adrian Georgescu
271 22 Adrian Georgescu
 '''Account.nat_traversal.use_msrp_relay_for_outbound''' (type={{{bool}}}, default={{{False}}})::
272 22 Adrian Georgescu
  If this setting is set to {{{True}}}, the MSRP relay will be used for all outgoing MSRP connections.
273 22 Adrian Georgescu
274 24 Adrian Georgescu
=== Presence  ===
275 22 Adrian Georgescu
276 24 Adrian Georgescu
 '''Account.presence.enabled''' (type={{{bool}}}, default={{{True}}})::
277 26 Adrian Georgescu
  If this setting is set to {{{True}}}, the Account will publish its presence state and subscribe to presence and presence.winfo Event packages. 
278 1 Adrian Georgescu
279 24 Adrian Georgescu
 '''Account.presence.use_rls_services''' (type={{{bool}}}, default={{{True}}})::
280 24 Adrian Georgescu
  If this setting is set to {{{True}}}, the Account will store its Buddy Lists in '''rls-services''' XCAP document  and send a single Subscribe for the ''presence'' event to the RLS services address to obtain the presence information for its buddies. If it is set to {{{False}}}, it will subscribe to each buddy individually.
281 1 Adrian Georgescu
282 21 Adrian Georgescu
=== RTP ===
283 8 Adrian Georgescu
284 1 Adrian Georgescu
 '''Account.rtp.audio_codecs''' (type={{{AudioCodecs}}}, default={{{None}}}, nillable={{{True}}})::
285 8 Adrian Georgescu
  This setting is used to specify the preferred audio codecs, which should be used for audio calls of this account. It must be a tuple containing only strings, which represent the supported codecs (speex, g722, g711, ilbc and gsm), in the order in which they are preferred, or {{{None}}} if the codec_list from the general rtp settings is to be used.
286 8 Adrian Georgescu
287 1 Adrian Georgescu
 '''Account.audio.srtp_encryption''' (type={{{SRTPEncryption}}}, default={{{'optional'}}})::
288 8 Adrian Georgescu
  The value of this setting specifies how the account requires the calls to be encrypted using SRTP. It can be one of the values {{{'disabled'}}}, {{{'optional'}}} or {{{'mandatory'}}}.
289 8 Adrian Georgescu
290 1 Adrian Georgescu
 '''Account.audio.use_srtp_without_tls''' (type={{{bool}}}, default={{{False}}})::
291 8 Adrian Georgescu
  If this setting is set to {{{True}}}, SRTP could be used even if the SIP signaling used to control the call is not over TLS.
292 8 Adrian Georgescu
293 24 Adrian Georgescu
=== SIP ===
294 8 Adrian Georgescu
295 24 Adrian Georgescu
 '''Account.sip.outbound_proxy''' (type={{{SIPProxy}}}, default={{{None}}}, nillable={{{True}}})::
296 24 Adrian Georgescu
  This setting specifies whether to send all SIP requests when creating a new SIP dialog to a specific proxy. If this setting is set to {{{None}}}, then an RFC3263 lookup will be done based on the domain part of the SIP request URI.
297 24 Adrian Georgescu
298 24 Adrian Georgescu
 '''Account.sip.register''' (type={{{bool}}}, default={{{True}}})::
299 24 Adrian Georgescu
  If this setting is set to {{{True}}}, the Account will automatically register when it is active. More about this is described in [wiki:SipMiddlewareApi#Account Account].
300 24 Adrian Georgescu
301 24 Adrian Georgescu
 '''Account.sip.publish_interval''' (type={{{NonNegativeInteger}}}, default={{{600}}})::
302 1 Adrian Georgescu
  This setting controls the number of seconds used for the ''Expire'' header when publishing events. It must be a non-negative integer.
303 1 Adrian Georgescu
304 1 Adrian Georgescu
 '''Account.sip.subscribe_interval''' (type={{{NonNegativeInteger}}}, default={{{600}}})::
305 1 Adrian Georgescu
  This setting controls the number of seconds used for the ''Expire'' header when subscribing to events. It must be a non-negative integer.
306 1 Adrian Georgescu
307 1 Adrian Georgescu
 '''Account.registration.interval''' (type={{{NonNegativeInteger}}}, default={{{600}}})::
308 1 Adrian Georgescu
  This setting controls the number of seconds used for the ''Expire'' header when registering. It must be a non-negative integer.
309 1 Adrian Georgescu
310 1 Adrian Georgescu
=== TLS ===
311 1 Adrian Georgescu
312 1 Adrian Georgescu
 '''Account.tls.certificate''' (type={{{DataPath}}}, default={{{None}}}, nillable={{{True}}})::
313 1 Adrian Georgescu
  The path to the file that contains the certificate and its private key used to authenticate on TLS connections. If it is set to relative path, it is taken relative to {{{SIPSimpleSettings.data_directory}}}; otherwise it is interpreted as an absolute path. In order to access the full path to the history directory, the value attribute on the setting can be used:
314 1 Adrian Georgescu
  {{{
315 1 Adrian Georgescu
  Account.tls.certificate.value
316 1 Adrian Georgescu
  }}}
317 1 Adrian Georgescu
318 1 Adrian Georgescu
 '''Account.tls.verify_server''' (type={{{bool}}}, default={{{False}}})::
319 1 Adrian Georgescu
  If this setting is set to {{{True}}}, the middleware will verify the server's certificate when connecting via TLS.
320 1 Adrian Georgescu
321 1 Adrian Georgescu
=== XCAP  ===
322 1 Adrian Georgescu
323 1 Adrian Georgescu
 '''Account.xcap.enabled''' (type={{{bool}}}, default={{{True}}})::
324 1 Adrian Georgescu
  If this setting is set to {{{True}}}, The use of XCAP root set below will be activated.
325 1 Adrian Georgescu
326 1 Adrian Georgescu
 '''Account.xcap.xcap_root''' (type={{{XCAPRoot}}}, default={{{None}}}, nillable={{{True}}})::
327 1 Adrian Georgescu
  The XCAP root is required for accessing documents via the XCAP protocol. It must be a URL with either the ''http'' or ''https'' schemes.
328 1 Adrian Georgescu
329 1 Adrian Georgescu
 '''Account.xcap.use_xcap_diff''' (type={{{bool}}}, default={{{True}}})::
330 1 Adrian Georgescu
  If this setting is set to {{{True}}}, the Account will subscribe to the ''xcap-diff'' event in order to find out if the XCAP documents handled by the Account are modified by another entity.
331 1 Adrian Georgescu
332 1 Adrian Georgescu
333 1 Adrian Georgescu
== BonjourAccount ==
334 1 Adrian Georgescu
335 1 Adrian Georgescu
{{{
336 1 Adrian Georgescu
Account bonjour@local:
337 1 Adrian Georgescu
          +-- display_name = Bonjour User
338 1 Adrian Georgescu
account --|-- enabled = False
339 1 Adrian Georgescu
          |-- rtp
340 1 Adrian Georgescu
          +-- tls
341 1 Adrian Georgescu
342 1 Adrian Georgescu
      +-- audio_codec_list = None
343 1 Adrian Georgescu
rtp --|-- inband_dtmf = False
344 1 Adrian Georgescu
      |-- srtp_encryption = optional
345 1 Adrian Georgescu
      +-- use_srtp_without_tls = False
346 1 Adrian Georgescu
347 1 Adrian Georgescu
      +-- certificate = tls/bonjour@local.crt
348 1 Adrian Georgescu
tls --|-- verify_server = False
349 1 Adrian Georgescu
      +
350 1 Adrian Georgescu
}}}
351 1 Adrian Georgescu
352 1 Adrian Georgescu
The BonjourAccount is a singleton object as there can only be one bonjour account on a system. A bonjour account is used in P2P mode and does not interact with any server. Similar to the Account, it is used both as a complex object, which contains the required behavior for bonjour, as well as a container for the settings which apply to it. 
353 1 Adrian Georgescu
354 1 Adrian Georgescu
The settings of the BonjourAccount are described below:
355 1 Adrian Georgescu
 
356 1 Adrian Georgescu
 '''BonjourAccount.id''' (type={{{SIPAddress}}})::
357 1 Adrian Georgescu
  This is not a setting, as it is the static string 'bonjour@local' which represents the id of the BonjourAccount.
358 1 Adrian Georgescu
359 1 Adrian Georgescu
 '''BonjourAccount.enabled''' (type={{{bool}}}, default={{{True}}})::
360 1 Adrian Georgescu
  If this setting is set to {{{True}}}, the account will be used. More information about this is in [wiki:SipMiddlewareApi#BonjourAccount BonjourAccount].
361 1 Adrian Georgescu
362 1 Adrian Georgescu
 '''BonjourAccount.display_name''' (type={{{str}}}, default={{{None}}}, nillable={{{True}}})::
363 1 Adrian Georgescu
  The contents of this setting will be sent as part of the ''From'' header when sending SIP requests.
364 1 Adrian Georgescu
365 1 Adrian Georgescu
=== RTP ===
366 1 Adrian Georgescu
367 1 Adrian Georgescu
 '''BonjourAccount.rtp.audio_codec_list''' (type={{{AudioCodecs}}}, default={{{('speex', 'g722', 'g711', 'ilbc', 'gsm')}}})::
368 1 Adrian Georgescu
  This setting is used to specify the preferred audio codecs, which should be used for audio calls of this account. It must be a tuple containing only strings, which represent the supported codecs (speex, g722, g711, ilbc and gsm), in the order in which they are preferred.
369 24 Adrian Georgescu
370 24 Adrian Georgescu
 '''BonjourAccount.rtp.srtp_encryption''' (type={{{SRTPEncryption}}}, default={{{'optional'}}})::
371 24 Adrian Georgescu
  The value of this setting specifies how the account requires the calls to be encrypted using SRTP. It can be one of the values {{{'disabled'}}}, {{{'optional'}}} or {{{'mandatory'}}}.
372 24 Adrian Georgescu
373 24 Adrian Georgescu
 '''BonjourAccount.rtp.use_srtp_without_tls''' (type={{{bool}}}, default={{{False}}})::
374 8 Adrian Georgescu
  If this setting is set to {{{True}}}, SRTP could be used even if the SIP signaling used to control the call is not over TLS.
375 1 Adrian Georgescu
376 8 Adrian Georgescu
=== TLS ===
377 8 Adrian Georgescu
378 1 Adrian Georgescu
 '''Account.tls.certificate''' (type={{{DataPath}}}, default={{{None}}}, nillable={{{True}}})::
379 8 Adrian Georgescu
  The path to the file that contains the certificate and its private key used to authenticate on TLS connections. If it is set to relative path, it is taken relative to {{{SIPSimpleSettings.user_data_directory}}}; otherwise it is interpreted as an absolute path. In order to access the full path to the history directory, the value attribute on the setting can be used:
380 8 Adrian Georgescu
  {{{
381 1 Adrian Georgescu
  Account.tls.certificate.value
382 8 Adrian Georgescu
  }}}
383 1 Adrian Georgescu
384 8 Adrian Georgescu
 '''Account.tls.verify_server''' (type={{{bool}}}, default={{{False}}})::
385 8 Adrian Georgescu
  If this setting is set to {{{True}}}, the middleware will verify the server's certificate when connecting via TLS.
386 1 Adrian Georgescu
387 27 Luci Stanescu
== SIPClients Settings Index ==
388 27 Luci Stanescu
389 27 Luci Stanescu
== General settings ==
390 27 Luci Stanescu
391 27 Luci Stanescu
 '''SIPSimpleSettings.user_data_directory''' (type={{{AbsolutePath}}}, default={{{'~/.sipclient}}})::
392 27 Luci Stanescu
  This is the directory, which will be used by default for storing the SIP SIMPLE data. The relative paths are calculated on runtime based on this setting, which means that if this setting is changed, all relative paths will point inside the new directory. It is a string, which must be an absolute path.
393 27 Luci Stanescu
394 27 Luci Stanescu
=== Audio ===
395 27 Luci Stanescu
396 27 Luci Stanescu
 '''SIPSimpleSettings.audio.directory''' (type={{{DataPath}}}, default={{{DataPath('history')}}})::
397 27 Luci Stanescu
  This directory will be used to store recorded audio conversations. Under this directory, a subdirectory per account with the id of the account as the name will be created. If it is set to relative path, it is taken relative to {{{SIPSimpleSettings.user_data_directory}}}; otherwise it is interpreted as an absolute path. In order to access the full path to the history directory, the value attribute on the setting can be used:
398 27 Luci Stanescu
  {{{
399 27 Luci Stanescu
  SIPSimpleSettings().audio.directory.value
400 27 Luci Stanescu
  }}}
401 27 Luci Stanescu
402 27 Luci Stanescu
=== File Transfer ===
403 27 Luci Stanescu
404 27 Luci Stanescu
 '''SIPSimpleSettings.file_transfer.directory''' (type={{{DataPath}}}, default={{{DataPath('file_transfers')}}})::
405 27 Luci Stanescu
  This directory is used to store the files obtained via MSRP file transfer. If it is set to relative path, it is taken relative to {{{SIPSimpleSettings.user_data_directory}}}; otherwise it is interpreted as an absolute path. In order to access the full path to the history directory, the value attribute on the setting can be used:
406 27 Luci Stanescu
  {{{
407 27 Luci Stanescu
  SIPSimpleSettings().file_transfer.directory.value
408 27 Luci Stanescu
  }}}
409 27 Luci Stanescu
410 27 Luci Stanescu
=== Logs ===
411 27 Luci Stanescu
412 27 Luci Stanescu
 '''SIPSimpleSettings.logs.directory''' (type={{{DataPath}}}, default={{{DataPath('logs')}}})::
413 27 Luci Stanescu
  This is the directory where the logs create by the SIP SIMPLE middleware will be stored. If it is set to relative path, it is taken relative to {{{SIPSimpleSettings.user_data_directory}}}; otherwise it is interpreted as an absolute path. In order to access the full path to the history directory, the value attribute on the setting can be used:
414 27 Luci Stanescu
  {{{
415 27 Luci Stanescu
  SIPSimpleSettings().logs.directory.value
416 27 Luci Stanescu
  }}}
417 27 Luci Stanescu
418 27 Luci Stanescu
 '''SIPSimpleSettings.logs.trace_sip''' (type={{{bool}}}, default={{{False}}})::
419 27 Luci Stanescu
  If this setting is set to True, the SIP packets will be written to a log file named 'sip_trace.txt', inside the directory pointed by {{{SIPSimpleSettings.logging.directory}}}.
420 27 Luci Stanescu
421 27 Luci Stanescu
 '''SIPSimpleSettings.logs.trace_pjsip''' (type={{{bool}}}, default={{{False}}})::
422 27 Luci Stanescu
  If this setting is set to True, the PJSIP log messages will be written to a log file named 'pjsip_trace.txt', inside the directory pointed by {{{SIPSimpleSettings.logging.directory}}}.
423 27 Luci Stanescu
424 27 Luci Stanescu
 '''SIPSimpleSettings.logs.trace_msrp''' (type={{{bool}}}, default={{{False}}})::
425 27 Luci Stanescu
  If this setting is set to True, the MSRP packets will be written to a log file named 'msrp_trace.txt', inside the directory pointed by {{{SIPSimpleSettings.logging.directory}}}.
426 27 Luci Stanescu
427 27 Luci Stanescu
 '''SIPSimpleSettings.logs.trace_xcap''' (type={{{bool}}}, default={{{False}}})::
428 27 Luci Stanescu
  If this setting is set to True, the XCAP packets will be written to a log file named 'xcap_trace.txt', inside the directory pointed by {{{SIPSimpleSettings.logging.directory}}}.
429 27 Luci Stanescu
430 27 Luci Stanescu
=== Sounds ===
431 27 Luci Stanescu
432 27 Luci Stanescu
 '''SIPSimpleSettings.sounds.audio_inbound''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
433 27 Luci Stanescu
  This setting should point to a wav file, which will be played when a SIP session request is received. If it is set to {{{None}}}, no sound will be played.
434 27 Luci Stanescu
435 27 Luci Stanescu
 '''SIPSimpleSettings.sounds.audio_outbound''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
436 27 Luci Stanescu
  This setting should point to a wav file, which will be used as ringtone during an outgoing SIP session request as a response to a 180 Ringing. If it is set to {{{None}}}, no sound will be played.
437 27 Luci Stanescu
438 27 Luci Stanescu
 '''SIPSimpleSettings.sounds.file_sent''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
439 27 Luci Stanescu
  This setting should point to a wav file, which will be played when an outgoing file transfer is finished. If it is set to {{{None}}}, no sound will be played.
440 27 Luci Stanescu
441 27 Luci Stanescu
 '''SIPSimpleSettings.sounds.file_received''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
442 27 Luci Stanescu
  This setting should point to a wav file, which will be played when an incoming file transfer is finished. If it is set to {{{None}}}, no sound will be played.
443 27 Luci Stanescu
444 27 Luci Stanescu
 '''SIPSimpleSettings.sounds.message_sent''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
445 27 Luci Stanescu
  This setting is a string representing an absolute path to a wav file, which is played when a message is sent in a chat session. If it is set to {{{None}}}, no sound is played.
446 27 Luci Stanescu
447 27 Luci Stanescu
 '''SIPSimpleSettings.sounds.message_received''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
448 27 Luci Stanescu
  This setting is a string representing an absolute path to a wav file, which is played when a message is received in a chat session. If it is set to {{{None}}}, no sound is played.
449 27 Luci Stanescu
450 27 Luci Stanescu
== Account ==
451 27 Luci Stanescu
452 27 Luci Stanescu
=== Sounds ===
453 27 Luci Stanescu
454 27 Luci Stanescu
 '''Account.sounds.audio_inbound''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
455 27 Luci Stanescu
  This setting should point to a wav file, which will be used to play the incoming ringtone. If it is set to {{{None}}}, the wav file set in {{{SIPSimpleSettings.sounds.audio_inbound}}} will be used instead.
456 27 Luci Stanescu
457 27 Luci Stanescu
== BonjourAccount ==
458 27 Luci Stanescu
459 27 Luci Stanescu
=== Sounds ===
460 27 Luci Stanescu
461 27 Luci Stanescu
 '''BonjourAccount.sounds.audio_inbound''' (type={{{AbsolutePath}}}, default={{{None}}}, nillable={{{True}}})::
462 27 Luci Stanescu
  This setting should point to a wav file which will be used as the incoming ringtone. If it is set to {{{None}}}, the wav file set in {{{SIPSimpleSettings.sounds.audio_inbound}}} will be used instead.
463 27 Luci Stanescu
464 1 Adrian Georgescu
== Architecture ==
465 1 Adrian Georgescu
466 1 Adrian Georgescu
Configuration API consists of the low-level classes that can be used for storing and retrieving configuration objects. Moreover, it allows the creation of a higher level API for accessing configuration items. The SIP SIMPLE settings are defined using this API, however application-specific settings can also make use of it in order to define a consistent view of all the settings.
467 1 Adrian Georgescu
468 1 Adrian Georgescu
The module '''sipsimple.configuration''' contains the main classes of the configuration API. These are:
469 1 Adrian Georgescu
470 1 Adrian Georgescu
 * ConfigurationManager
471 1 Adrian Georgescu
 * SettingsObject
472 1 Adrian Georgescu
 * SettingsGroup
473 1 Adrian Georgescu
 * Setting
474 1 Adrian Georgescu
475 1 Adrian Georgescu
In addition, the exceptions which make up this package are:
476 1 Adrian Georgescu
477 1 Adrian Georgescu
 * ConfigurationError (base class for all other configuration errors)
478 1 Adrian Georgescu
 * DuplicateSectionError
479 1 Adrian Georgescu
 * UnknownSectionError
480 1 Adrian Georgescu
 * UnknownNameError
481 1 Adrian Georgescu
482 1 Adrian Georgescu
The package '''sipsimple.configuration.backend''' contains the abstract interface for configuration backends, as well as concrete implementations of backends. This package is explained in more detail in [wiki:SipConfigurationAPI#ConfigurationBackendAPI Configuration Backend API].
483 1 Adrian Georgescu
484 1 Adrian Georgescu
=== Configuration Manager ===
485 1 Adrian Georgescu
486 1 Adrian Georgescu
The central entity is the ConfigurationManager, which is used for storing and retrieving configuration objects. Each stored configuration object has an associated name and a section, which allows similar objects or objects of the same type to be grouped together under the same section. Note that the names of the objects need to be unique inside a section. A pluggable backend system explained in [wiki:SipConfigurationAPI#ConfigurationBackendAPI Configuration Backend API] allows the configuration to be stored using any format, which can store (name, value) string pairs in sections.
487 1 Adrian Georgescu
488 1 Adrian Georgescu
The ConfigurationManager class is a singleton to allow any part of the code to access it without the need to pass references. However, its '''start''' method needs to be called before it can be used. Once this is done, objects can be added, retrieved or deleted from the underlying storage. The methods of ConfigurationManager are:
489 1 Adrian Georgescu
490 1 Adrian Georgescu
 '''!__init!__'''(''self'')::
491 1 Adrian Georgescu
 References to the ConfigurationManager instance can be obtained anytime without passing any arguments. However, it needs the manager needs to be started in order to be used, otherwise all methods will raise a RuntimeError.
492 1 Adrian Georgescu
 '''start'''(''self'', '''backend'''={{{None}}})::
493 1 Adrian Georgescu
 The start method allows the ConfigurationManager instance to use the specified backend for accessing the underlying storage. If a backend is not provided, then a {{{sipsimple.configuration.backend.configfile.ConfigFileBackend}}} instance will be created, without passing any arguments to the constructor. See [wiki:SipConfigurationAPI#ConfigFileBackend ConfigFileBackend] for information on how this object stores the data.
494 1 Adrian Georgescu
 '''set'''(''self'', '''section''', '''name''', '''object''')::
495 1 Adrian Georgescu
 The {{{object}}} will be sent to the configuration backend for storing, under {{{section}}}, with the specified {{{name}}}. If there already was an object with that name, it will be overwritten. If the section did not exist, then it will be created first. Note that changes are not guaranteed to have been written to the underlying storage until the '''save''' method is called.
496 1 Adrian Georgescu
 '''delete'''(''self'', '''section''', '''name''')::
497 1 Adrian Georgescu
 If an object stored as {{{name}}} exists in {{{section}}}, then it will be deleted. If the section was never created, then an {{{UnknownSectionError}}} will be raised.
498 1 Adrian Georgescu
 '''get'''(''self'', '''section''', '''name''')::
499 1 Adrian Georgescu
 Retrieves the object stored with {{{name}}} in {{{section}}}, if it exists. Otherwise, the method will raise an {{{UnknownSectionError}}} or an {{{UnknownNameError}}} if the section or name do not exist.
500 1 Adrian Georgescu
 '''get_names'''(''self'', '''section''')::
501 1 Adrian Georgescu
 Returns a list with all the names of the objects in {{{section}}}. Will raise {{{UnknownSectionError}}} if the section does not exist.
502 1 Adrian Georgescu
 '''save'''(''self'')::
503 1 Adrian Georgescu
 Flushes the changes made to the configuration to disk. This method must be called to ensure that all changes have been written.
504 1 Adrian Georgescu
505 1 Adrian Georgescu
The notifications of the ConfigurationManager are:
506 1 Adrian Georgescu
 '''CFGManagerSaveFailed'''::
507 1 Adrian Georgescu
 This notification is sent when a SettingsObject needs to be stored to the persisent storage, but the process fails. The attributes of it are:
508 1 Adrian Georgescu
 [[BR]]''exception'':[[BR]]
509 1 Adrian Georgescu
 The exception which was raised when the storing failed.
510 1 Adrian Georgescu
 [[BR]]''modified'':[[BR]]
511 1 Adrian Georgescu
 This attribute is only set if the storage process was started as a result of calling the save method on the SettingsObject. It's contents is the same as for the {{{CFGSettingsObjectDidChange}}} notification.
512 1 Adrian Georgescu
513 1 Adrian Georgescu
514 1 Adrian Georgescu
=== SettingsObject ===
515 1 Adrian Georgescu
516 1 Adrian Georgescu
A SettingsObject is used to represent a hierarchy of settings, which are managed via the ConfigurationManager. There are two types of SettingsObject:
517 1 Adrian Georgescu
 * pure Singleton SettingsObjects, i.e. there is only one instance of this SettingsObject in an application. This also means that the object cannot be deleted. An example of such a SettingsObject is SIPSimpleSettings. These SettingsObjects are useful to represent global settings.
518 1 Adrian Georgescu
 * SettingsObject with an associated id. These are Singleton as well, but there is more than one instance: one per id. The instances are not necessarily persistent. New ones can be created and existing ones can be deleted. An example of such a SettingsObject is the Account. These SettingsObjects are useful to represent settings which apply to entities identifiable by a string id.
519 1 Adrian Georgescu
520 1 Adrian Georgescu
All SettingsObjects belong to a specific section, specified using the {{{__section__}}} attribute.
521 1 Adrian Georgescu
522 1 Adrian Georgescu
When a SettingsObject is instantiated its contained settings are loaded from the configuration storage. If it is the first time a SettingsObject is created, the default values for the settings will apply. The SettingsObject will only be copied to storage when its '''save''' method is called.
523 1 Adrian Georgescu
524 1 Adrian Georgescu
==== Defining a global SettingsObject ====
525 1 Adrian Georgescu
526 1 Adrian Georgescu
In order to define a global SettingsObject, the {{{__section__}}} and {{{__id__}}} attributes must be defined on the class. The {{{__id__}}} must not be used in any other SettingsObject which is stored in the same section. An example of defining a global SettingsObject:
527 1 Adrian Georgescu
{{{
528 1 Adrian Georgescu
from sipsimple.configuration import SettingsObject
529 1 Adrian Georgescu
530 1 Adrian Georgescu
class SIPSimpleSettings(SettingsObject):
531 1 Adrian Georgescu
    __section__ = 'Global'
532 1 Adrian Georgescu
    __id__ = 'SIPSimple'
533 1 Adrian Georgescu
}}}
534 1 Adrian Georgescu
535 1 Adrian Georgescu
The {{{__init__}}} method must not accept any other argument except ''self''. It will be called each time the settings are loaded from the storage, not only the first time the object is created.
536 1 Adrian Georgescu
537 1 Adrian Georgescu
538 1 Adrian Georgescu
==== Defining a per-id SettingsObject ====
539 1 Adrian Georgescu
540 1 Adrian Georgescu
In order to define a per-id SettingsObject, the {{{__section__}}} attribute must be defined on the class, while the {{{__id__}}} attribute must be left to None. When instantiating the resulting class, exactly one argument must be given, which represents the string id. Each class defined as a per-id SettingsObject must be allocated a different section from all the other SettingsObjects (including global ones), otherwise the keys under which the SettingsObjects are stored could overlap. An example of defining a per-id SettingsObject:
541 1 Adrian Georgescu
{{{
542 1 Adrian Georgescu
from sipsimple.configuration import SettingsObject
543 1 Adrian Georgescu
544 1 Adrian Georgescu
class Account(SettingsObject):
545 1 Adrian Georgescu
    __section__ = 'Accounts'
546 1 Adrian Georgescu
    def __init__(self, id):
547 1 Adrian Georgescu
        """Do something each time the Account is loaded"""
548 1 Adrian Georgescu
}}}
549 1 Adrian Georgescu
550 1 Adrian Georgescu
The {{{__init__}}} method must accept exactly one argument except ''self''. It will be called each time the object is loaded from the storage, in addition to the first time the object is created. This allows the SettingsObject to be more than a simple collection of settings.
551 1 Adrian Georgescu
552 1 Adrian Georgescu
==== Instance methods of SettingsObjects ====
553 1 Adrian Georgescu
554 1 Adrian Georgescu
 '''save'''(''self'')::
555 1 Adrian Georgescu
 If the contained Settings of this SettingsObject have changed, the object will be saved to the persistent storage. A CFGSettingsObjectDidChange notification will be issued which contains the modified settings. If the save fails, a CFGManagerSaveFailed notification is issued in addition.
556 1 Adrian Georgescu
 '''delete'''(''self'')::
557 1 Adrian Georgescu
 This method can only be called on per-id SettingsObjects. It will delete the object from the persistent storage. All references to this SettingsObject must be removed.
558 1 Adrian Georgescu
559 1 Adrian Georgescu
==== Notifications ====#SettingsObjectNotifications
560 1 Adrian Georgescu
561 1 Adrian Georgescu
 '''CFGSettingsObjectDidChange'''::
562 1 Adrian Georgescu
 This notification is sent when the save method of a SettingsObject is called. Attributes:
563 1 Adrian Georgescu
 [[BR]]''modified'':[[BR]]
564 1 Adrian Georgescu
 A dict instance which maps settings keys in their fully qualified form (attribute names seperated by '.', relative to the SettingsObject) to a ModifiedValue instance; the ModifiedValue instance contains two attributes: ''old'' and ''new'' which are set to the old and the new Setting's value respectively.
565 1 Adrian Georgescu
566 1 Adrian Georgescu
567 1 Adrian Georgescu
=== Setting ===
568 1 Adrian Georgescu
569 1 Adrian Georgescu
The Setting descriptor is used to describe a setting in SettingsObjects. The following methods are part of the public API of it:
570 1 Adrian Georgescu
 '''!__init!__'''(''self'', '''type''', '''default'''={{{None}}}, '''nillable'''={{{False}}})::
571 1 Adrian Georgescu
 Create a new Setting descriptor which represents a setting in all instances of a SettingsObject. The default value must be specified if the setting is not nillable. The type will be applied to the values which are set to this descriptor if the value is not already an instance of the type.
572 1 Adrian Georgescu
573 1 Adrian Georgescu
An example of using a setting:
574 1 Adrian Georgescu
{{{
575 1 Adrian Georgescu
from sipsimple.configuration import Setting, SettingsObject
576 1 Adrian Georgescu
577 1 Adrian Georgescu
class SIPSimpleSettings(SettingsObject):
578 1 Adrian Georgescu
    __section__ = 'Global'
579 1 Adrian Georgescu
    __id__ = 'SIPSimple'
580 1 Adrian Georgescu
581 1 Adrian Georgescu
    user_agent = Setting(type=str, default='sipsimple %s' % __version__)
582 1 Adrian Georgescu
}}}
583 1 Adrian Georgescu
584 1 Adrian Georgescu
585 1 Adrian Georgescu
=== SettingsGroup ===
586 1 Adrian Georgescu
587 1 Adrian Georgescu
A SettingsGroup allows settings to be structured hierarchically. Subclasses of SettingsGroup are containers for Settings and other SettingsGroups just as SettingsObjects are. In addition, the subclasses of SettingsGroup are descriptors and can be used as such to assign a SettingsGroup as a child of another SettingsGroup or a SettingsObject. An example usage containing Setting, SettingsGroup and SettingsObject:
588 1 Adrian Georgescu
{{{
589 1 Adrian Georgescu
from sipsimple.configuration import Setting, SettingsGroup, SettingsObject
590 1 Adrian Georgescu
591 1 Adrian Georgescu
class TLSSettings(SettingsGroup):
592 1 Adrian Georgescu
    verify_server = Setting(type=bool, default=False)
593 1 Adrian Georgescu
594 1 Adrian Georgescu
class SIPSimpleSettings(SettingsObject):
595 1 Adrian Georgescu
    __section__ = 'Global'
596 1 Adrian Georgescu
    __id__ = 'SIPSimple'
597 1 Adrian Georgescu
598 1 Adrian Georgescu
    user_agent = Setting(type=str, default='sipsimple %s' % __version__)
599 1 Adrian Georgescu
600 1 Adrian Georgescu
    tls = TLSSettings
601 1 Adrian Georgescu
}}}
602 1 Adrian Georgescu
603 1 Adrian Georgescu
=== Backend API ===
604 1 Adrian Georgescu
605 1 Adrian Georgescu
The backend API provides a way to use the configuration framework consistently, while using any system for storing the data persistently. The ConfigurationManager makes use of a backend whenever it needs to write/read something to the persistent storage. The backend only needs to know how to handle (key, value) string pairs in sections. In order to use a specific backend, it is given to the ConfigurationManager in its start method.
606 1 Adrian Georgescu
607 1 Adrian Georgescu
The interface '''sipsimple.configuration.backend.IBackend''' describes the backend:
608 1 Adrian Georgescu
 '''add_section'''('''section''')::
609 1 Adrian Georgescu
 Add a section with a specified name or raise DuplicateSectionError if the section already exists.
610 1 Adrian Georgescu
 '''delete_section'''('''section''')::
611 1 Adrian Georgescu
 Delete a section identified by a name or raise UnknownSectionError if the section does not exist.
612 1 Adrian Georgescu
 '''set'''('''section''', '''name''', '''value''')::
613 1 Adrian Georgescu
 Set a name, value pair inside a section. Will overwrite the previous pair, if it exists; otherwise raise UnknownSectionError if the section does not exist.
614 1 Adrian Georgescu
 '''delete'''('''section''', '''name''')::
615 1 Adrian Georgescu
 Delete a name, value pair from a section or raise UnknownSectionError if the section does not exist.
616 1 Adrian Georgescu
 '''get'''('''section''', '''name''')::
617 1 Adrian Georgescu
 Get the value associated to the name, in the specified section or raise UnknownNameError if such a name, value pair does not exist and UnknownSectionError if the section does not exist.
618 1 Adrian Georgescu
 '''get_names'''('''section''')::
619 1 Adrian Georgescu
 Get all the names from  the specified section or raise UnknownSectionError if the section does not exist.
620 1 Adrian Georgescu
 '''save'''()::
621 1 Adrian Georgescu
 Flush the modified name, value pairs.
622 1 Adrian Georgescu
623 1 Adrian Georgescu
624 1 Adrian Georgescu
==== ConfigFileBackend ====
625 1 Adrian Georgescu
626 1 Adrian Georgescu
A concrete implementation of the '''IBackend''' interface resides in '''sipsimple.configuration.backend.configfile.ConfigFileBackend'''. The methods different from the ones in '''IBackend''' are:
627 1 Adrian Georgescu
628 1 Adrian Georgescu
 '''!__init!__'''(''self'', '''filename'''={{{None}}})::
629 1 Adrian Georgescu
 Create a new ConfigFileBackend which uses the specified filename for loading and storing the data to. If it is not given, it defaults to {{{~/.sipclient/config}}}.
630 27 Luci Stanescu
631 27 Luci Stanescu
632 27 Luci Stanescu
===