The backend service is responsible for storing received messages and giving the SMSD core messages to send. It is solely up to them how the message will be stored, for example currently Gammu includes backends to store messages on filesystem (Files backend), various databases (MySQL Backend, PostgreSQL Backend, DBI Backend) or backend which does not store anything at all (Null Backend).
Each backend service needs to support several operations, which are exported in GSM_SMSDService structure:
Initializes internal state, connect to backend storage.
Parameters: |
|
---|---|
Returns: | Error code. |
Freeing internal data, disconnect from backend storage.
Parameters: |
|
---|---|
Returns: | Error code. |
Optional hook called after SMSD is connected to phone, can be used for storing infromation about phone in backend.
Parameters: |
|
---|---|
Returns: | Error code. |
Saves message into inbox.
Parameters: |
|
---|---|
Returns: | Error code. |
Finds message in outbox suitable for sending.
Parameters: |
|
---|---|
Returns: | Error code. |
Moves sent message from outbox to sent items.
Parameters: |
|
---|---|
Returns: | Error code. |
Saves message into outbox queue.
Parameters: |
|
---|---|
Returns: | Error code. |
Logs information about sent message (eg. delivery report).
Parameters: |
|
---|---|
Returns: | Error code. |
Updates sending status in service backend.
Parameters: |
|
---|---|
Returns: | Error code. |
Updates information about phone in database (network status, battery, etc.).
Parameters: |
|
---|---|
Returns: | Error code. |
Reads configuration specific for this backend.
Parameters: |
|
---|---|
Returns: | Error code. |
You might have noticed that message ID is often used in the API. The primary reason for this is that it is usually easier for backend to handle message just by it’s internal identification instead of handling message data from GSM_MultiSMSMessage.
If the backend does not use any IDs internally, it really does not have to provide them, with only exception of GSM_SMSDService::FindOutboxSMS(), where ID is used for detection of repeated sending of same message.
The lifetime of ID for sent message:
- GSM_SMSDService::CreateOutboxSMS() or direct manipulation with backend storage creates new ID
- GSM_SMSDService::FindOutboxSMS() returns ID of message to process
- GSM_SMSDService::AddSentSMSInfo() and GSM_SMSDService::RefreshSendStatus() are then notified using this ID about sending of the message
- GSM_SMSDService::MoveSMS() then moves the message based on ID to sent items
The lifetime of ID for incoming messages:
- GSM_SMSDService::SaveInboxSMS() generates the message
- RunOnReceive Directive uses this ID
digraph smsdsending { "new message" [shape=box]; "message in storage" [shape=box]; "message sent" [shape=box]; "error sending message" [shape=box]; "new message" -> "manually created SMS"; "new message" -> "CreateOutboxSMS"; "manually created SMS" -> "message in storage"; "CreateOutboxSMS" -> "message in storage" "message in storage" -> "FindOutboxSMS"; "FindOutboxSMS" -> "AddSentSMSInfo(ERROR)" [label="Error", style=dotted]; "FindOutboxSMS" -> "check duplicates"; "check duplicates" -> "AddSentSMSInfo(ERROR)" [label="Too many retries", style=dotted]; "check duplicates" -> "GSM_SendSMS"; "GSM_SendSMS" -> "RefreshSendStatus"; "GSM_SendSMS" -> "AddSentSMSInfo(ERROR)" [label="Error", style=dotted]; "RefreshSendStatus" -> "RefreshSendStatus" [label="Sending"]; "RefreshSendStatus" -> "AddSentSMSInfo(ERROR)" [label="Timeout", style=dotted]; "RefreshSendStatus" -> "AddSentSMSInfo(OK)"; "AddSentSMSInfo(OK)" -> "MoveSMS(noforce, OK)"; "MoveSMS(noforce, OK)" -> "MoveSMS(force, ERR)" [label="Error", style=dotted]; "AddSentSMSInfo(OK)" -> "MoveSMS(force, ERR)" [label="Error", style=dotted]; "AddSentSMSInfo(ERROR)" -> "MoveSMS(force, ERR)"; "MoveSMS(noforce, OK)" -> "message sent"; "MoveSMS(force, ERR)" -> "error sending message"; }
digraph smsdreceiving { "received message" [shape=box]; "ignored message" [shape=box]; "failed message" [shape=box]; "waiting message" [shape=box]; "processed message" [shape=box]; "received message" -> "GSM_GetNextSMS"; "GSM_GetNextSMS" -> "SMSD_ValidMessage"; "SMSD_ValidMessage" -> "GSM_LinkSMS"; "SMSD_ValidMessage" -> "ignored message" [label="Not valid", style=dotted]; "GSM_LinkSMS" -> "SMSD_CheckMultipart"; "SMSD_CheckMultipart" -> "SaveInboxSMS"; "SMSD_CheckMultipart" -> "waiting message" [label="Not all parts", style=dotted]; "SaveInboxSMS" -> "SMSD_RunOnReceive" [label="Locations are passed here"]; "SaveInboxSMS" -> "failed message" [label="Error", style=dotted]; "SMSD_RunOnReceive" -> "GSM_DeleteSMS"; "GSM_DeleteSMS" -> "processed message" "GSM_DeleteSMS" -> "failed message" [label="Error", style=dotted]; }