7 #ifdef __FUNCTION__WORKING
8 #define PRINT_FUNCTION_START smprintf(s, "Entering %s\n", __FUNCTION__);
9 #define PRINT_FUNCTION_END smprintf(s, "Leaving %s\n", __FUNCTION__);
11 #define PRINT_FUNCTION_START smprintf(s, "Entering %s:%d\n", __FILE__, __LINE__);
12 #define PRINT_FUNCTION_END smprintf(s, "Leaving %s:%d\n", __FILE__, __LINE__);
14 #define PRINT_MEMORY_INFO() smprintf(s, "Location = %d, Memory type = %s\n", entry->Location, GSM_MemoryTypeToString(entry->MemoryType));
15 #define PRINT_TODO_INFO() smprintf(s, "Location = %d\n", ToDo->Location);
16 #define PRINT_CALENDAR_INFO() smprintf(s, "Location = %d\n", Note->Location);
17 #define PRINT_NOTE_INFO() smprintf(s, "Location = %d\n", Note->Location);
18 #define PRINT_MSMS_INFO() smprintf(s, "Number = %d, Location = %d, Folder = %d\n", sms->Number, sms->SMS[0].Location, sms->SMS[0].Folder);
19 #define PRINT_SMS_INFO() smprintf(s, "Location = %d, Folder = %d\n", sms->Location, sms->Folder);
20 #define PRINT_START() if (start) smprintf(s, "Starting reading!\n");
23 * Prints error message (if any) to debug log.
25 * \param err Error code to check.
27 #define PRINT_LOG_ERROR(err) \
29 GSM_LogError(s, __FUNCTION__, err); \
34 * Checks whether we are connected to phone, fails with error
37 #define CHECK_PHONE_CONNECTION() \
39 PRINT_FUNCTION_START \
40 if (!GSM_IsConnected(s)) { \
41 return ERR_NOTCONNECTED; \
46 * Tries the command a couple of times to see if it can complete
47 * without an ERR_BUSY return.
49 #define RUN_RESTARTABLE(return_value, function_call) \
52 for (restarts = 0; restarts < 10; ++restarts) { \
53 unsigned useconds = 10000 << restarts; \
54 return_value = (function_call); \
55 if (return_value != ERR_BUSY) \
57 smprintf(s, "Sleeping %d ms before retrying the last command\n", useconds / 1000); \
63 * Reads manufacturer from phone.
65 GSM_Error
GSM_GetManufacturer(GSM_StateMachine
*s
, char *value
)
69 CHECK_PHONE_CONNECTION();
71 s
->Phone
.Data
.Manufacturer
[0] = '\0';
72 err
= s
->Phone
.Functions
->GetManufacturer(s
);
74 strcpy(value
, s
->Phone
.Data
.Manufacturer
);
81 * Reads model from phone.
83 GSM_Error
GSM_GetModel(GSM_StateMachine
*s
, char *value
)
87 CHECK_PHONE_CONNECTION();
89 s
->Phone
.Data
.Model
[0] = '\0';
90 err
= s
->Phone
.Functions
->GetModel(s
);
92 strcpy(value
, s
->Phone
.Data
.Model
);
99 * Reads firmware information from phone.
101 GSM_Error
GSM_GetFirmware(GSM_StateMachine
*s
, char *value
, char *date
, double *num
)
105 CHECK_PHONE_CONNECTION();
107 s
->Phone
.Data
.Version
[0] = '\0';
108 err
= s
->Phone
.Functions
->GetFirmware(s
);
110 strcpy(value
, s
->Phone
.Data
.Version
);
113 strcpy(date
, s
->Phone
.Data
.VerDate
);
116 *num
= s
->Phone
.Data
.VerNum
;
119 PRINT_LOG_ERROR(err
);
123 * Reads IMEI/serial number from phone.
125 GSM_Error
GSM_GetIMEI(GSM_StateMachine
*s
, char *value
)
129 CHECK_PHONE_CONNECTION();
131 s
->Phone
.Data
.IMEI
[0] = '\0';
132 err
= s
->Phone
.Functions
->GetIMEI(s
);
134 strcpy(value
, s
->Phone
.Data
.IMEI
);
137 PRINT_LOG_ERROR(err
);
141 * Gets date and time from phone.
143 GSM_Error
GSM_GetOriginalIMEI(GSM_StateMachine
*s
, char *value
)
147 CHECK_PHONE_CONNECTION();
149 err
= s
->Phone
.Functions
->GetOriginalIMEI(s
, value
);
150 PRINT_LOG_ERROR(err
);
154 * Gets month when device was manufactured.
156 GSM_Error
GSM_GetManufactureMonth(GSM_StateMachine
*s
, char *value
)
160 CHECK_PHONE_CONNECTION();
162 err
= s
->Phone
.Functions
->GetManufactureMonth(s
, value
);
163 PRINT_LOG_ERROR(err
);
167 * Gets product code of device.
169 GSM_Error
GSM_GetProductCode(GSM_StateMachine
*s
, char *value
)
173 CHECK_PHONE_CONNECTION();
175 err
= s
->Phone
.Functions
->GetProductCode(s
, value
);
176 PRINT_LOG_ERROR(err
);
180 * Gets hardware information about device.
182 GSM_Error
GSM_GetHardware(GSM_StateMachine
*s
, char *value
)
186 CHECK_PHONE_CONNECTION();
188 err
= s
->Phone
.Functions
->GetHardware(s
, value
);
189 PRINT_LOG_ERROR(err
);
193 * Gets PPM (Post Programmable Memory) info from phone
194 * (in other words for Nokia get, which language pack is in phone)
196 GSM_Error
GSM_GetPPM(GSM_StateMachine
*s
, char *value
)
200 CHECK_PHONE_CONNECTION();
202 err
= s
->Phone
.Functions
->GetPPM(s
, value
);
203 PRINT_LOG_ERROR(err
);
207 * Gets SIM IMSI from phone.
209 GSM_Error
GSM_GetSIMIMSI(GSM_StateMachine
*s
, char *IMSI
)
213 CHECK_PHONE_CONNECTION();
215 err
= s
->Phone
.Functions
->GetSIMIMSI(s
, IMSI
);
216 PRINT_LOG_ERROR(err
);
220 * Reads date and time from phone.
222 GSM_Error
GSM_GetDateTime(GSM_StateMachine
*s
, GSM_DateTime
*date_time
)
226 CHECK_PHONE_CONNECTION();
228 err
= s
->Phone
.Functions
->GetDateTime(s
, date_time
);
229 PRINT_LOG_ERROR(err
);
233 * Sets date and time in phone.
235 GSM_Error
GSM_SetDateTime(GSM_StateMachine
*s
, GSM_DateTime
*date_time
)
239 CHECK_PHONE_CONNECTION();
241 err
= s
->Phone
.Functions
->SetDateTime(s
, date_time
);
242 PRINT_LOG_ERROR(err
);
246 * Reads alarm set in phone.
248 GSM_Error
GSM_GetAlarm(GSM_StateMachine
*s
, GSM_Alarm
*Alarm
)
252 CHECK_PHONE_CONNECTION();
254 err
= s
->Phone
.Functions
->GetAlarm(s
, Alarm
);
255 PRINT_LOG_ERROR(err
);
259 * Sets alarm in phone.
261 GSM_Error
GSM_SetAlarm(GSM_StateMachine
*s
, GSM_Alarm
*Alarm
)
265 CHECK_PHONE_CONNECTION();
267 err
= s
->Phone
.Functions
->SetAlarm(s
, Alarm
);
268 PRINT_LOG_ERROR(err
);
272 * Gets locale from phone.
274 GSM_Error
GSM_GetLocale(GSM_StateMachine
*s
, GSM_Locale
*locale
)
278 CHECK_PHONE_CONNECTION();
280 err
= s
->Phone
.Functions
->GetLocale(s
, locale
);
281 PRINT_LOG_ERROR(err
);
285 * Sets locale of phone.
287 GSM_Error
GSM_SetLocale(GSM_StateMachine
*s
, GSM_Locale
*locale
)
291 CHECK_PHONE_CONNECTION();
293 err
= s
->Phone
.Functions
->SetLocale(s
, locale
);
294 PRINT_LOG_ERROR(err
);
298 * Emulates key press or key release.
300 GSM_Error
GSM_PressKey(GSM_StateMachine
*s
, GSM_KeyCode Key
, gboolean Press
)
304 CHECK_PHONE_CONNECTION();
306 err
= s
->Phone
.Functions
->PressKey(s
, Key
, Press
);
307 PRINT_LOG_ERROR(err
);
311 * Performs phone reset.
313 GSM_Error
GSM_Reset(GSM_StateMachine
*s
, gboolean hard
)
317 CHECK_PHONE_CONNECTION();
319 err
= s
->Phone
.Functions
->Reset(s
, hard
);
320 PRINT_LOG_ERROR(err
);
324 * Resets phone settings.
326 GSM_Error
GSM_ResetPhoneSettings(GSM_StateMachine
*s
, GSM_ResetSettingsType Type
)
330 CHECK_PHONE_CONNECTION();
332 err
= s
->Phone
.Functions
->ResetPhoneSettings(s
, Type
);
333 PRINT_LOG_ERROR(err
);
337 * Enters security code (PIN, PUK,...) .
339 GSM_Error
GSM_EnterSecurityCode(GSM_StateMachine
*s
, GSM_SecurityCode
*Code
)
343 CHECK_PHONE_CONNECTION();
345 err
= s
->Phone
.Functions
->EnterSecurityCode(s
, Code
);
346 PRINT_LOG_ERROR(err
);
350 * Queries whether some security code needs to be entered./
352 GSM_Error
GSM_GetSecurityStatus(GSM_StateMachine
*s
, GSM_SecurityCodeType
*Status
)
356 CHECK_PHONE_CONNECTION();
358 err
= s
->Phone
.Functions
->GetSecurityStatus(s
, Status
);
359 PRINT_LOG_ERROR(err
);
363 * Acquired display status.
365 GSM_Error
GSM_GetDisplayStatus(GSM_StateMachine
*s
, GSM_DisplayFeatures
*features
)
369 CHECK_PHONE_CONNECTION();
371 err
= s
->Phone
.Functions
->GetDisplayStatus(s
, features
);
372 PRINT_LOG_ERROR(err
);
376 * Enables network auto login.
378 GSM_Error
GSM_SetAutoNetworkLogin(GSM_StateMachine
*s
)
382 CHECK_PHONE_CONNECTION();
384 err
= s
->Phone
.Functions
->SetAutoNetworkLogin(s
);
385 PRINT_LOG_ERROR(err
);
389 * Gets information about batery charge and phone charging state.
391 GSM_Error
GSM_GetBatteryCharge(GSM_StateMachine
*s
, GSM_BatteryCharge
*bat
)
395 CHECK_PHONE_CONNECTION();
397 memset(bat
, 0, sizeof(GSM_BatteryCharge
));
399 err
= s
->Phone
.Functions
->GetBatteryCharge(s
, bat
);
400 PRINT_LOG_ERROR(err
);
404 * Reads signal quality (strength and error rate).
406 GSM_Error
GSM_GetSignalQuality(GSM_StateMachine
*s
, GSM_SignalQuality
*sig
)
410 CHECK_PHONE_CONNECTION();
412 err
= s
->Phone
.Functions
->GetSignalQuality(s
, sig
);
413 PRINT_LOG_ERROR(err
);
417 * Gets network information.
419 GSM_Error
GSM_GetNetworkInfo(GSM_StateMachine
*s
, GSM_NetworkInfo
*netinfo
)
423 CHECK_PHONE_CONNECTION();
427 netinfo
->PacketCID
[0] = 0;
428 netinfo
->PacketLAC
[0] = 0;
429 netinfo
->State
= GSM_NetworkStatusUnknown
;
430 netinfo
->PacketState
= GSM_NetworkStatusUnknown
;
431 netinfo
->NetworkName
[0] = 0;
432 netinfo
->NetworkName
[1] = 0;
433 netinfo
->NetworkCode
[0] = 0;
436 err
= s
->Phone
.Functions
->GetNetworkInfo(s
, netinfo
);
437 PRINT_LOG_ERROR(err
);
441 * Reads category from phone.
443 GSM_Error
GSM_GetCategory(GSM_StateMachine
*s
, GSM_Category
*Category
)
447 CHECK_PHONE_CONNECTION();
449 err
= s
->Phone
.Functions
->GetCategory(s
, Category
);
450 PRINT_LOG_ERROR(err
);
454 * Adds category to phone.
456 GSM_Error
GSM_AddCategory(GSM_StateMachine
*s
, GSM_Category
*Category
)
460 CHECK_PHONE_CONNECTION();
462 err
= s
->Phone
.Functions
->AddCategory(s
, Category
);
463 PRINT_LOG_ERROR(err
);
467 * Reads category status (number of used entries) from phone.
469 GSM_Error
GSM_GetCategoryStatus(GSM_StateMachine
*s
, GSM_CategoryStatus
*Status
)
473 CHECK_PHONE_CONNECTION();
475 err
= s
->Phone
.Functions
->GetCategoryStatus(s
, Status
);
476 PRINT_LOG_ERROR(err
);
480 * Gets memory (phonebooks or calls) status (eg. number of used and
483 GSM_Error
GSM_GetMemoryStatus(GSM_StateMachine
*s
, GSM_MemoryStatus
*status
)
487 CHECK_PHONE_CONNECTION();
489 err
= s
->Phone
.Functions
->GetMemoryStatus(s
, status
);
490 PRINT_LOG_ERROR(err
);
494 * Reads entry from memory (phonebooks or calls). Which entry should
495 * be read is defined in entry.
497 GSM_Error
GSM_GetMemory(GSM_StateMachine
*s
, GSM_MemoryEntry
*entry
)
501 CHECK_PHONE_CONNECTION();
504 err
= s
->Phone
.Functions
->GetMemory(s
, entry
);
505 PRINT_LOG_ERROR(err
);
509 * Reads entry from memory (phonebooks or calls). Which entry should
510 * be read is defined in entry. This can be easily used for reading all entries.
512 GSM_Error
GSM_GetNextMemory(GSM_StateMachine
*s
, GSM_MemoryEntry
*entry
, gboolean start
)
516 CHECK_PHONE_CONNECTION();
520 err
= s
->Phone
.Functions
->GetNextMemory(s
, entry
, start
);
521 PRINT_LOG_ERROR(err
);
525 * Sets memory (phonebooks or calls) entry.
527 GSM_Error
GSM_SetMemory(GSM_StateMachine
*s
, GSM_MemoryEntry
*entry
)
531 CHECK_PHONE_CONNECTION();
534 RUN_RESTARTABLE(err
, s
->Phone
.Functions
->SetMemory(s
, entry
));
535 PRINT_LOG_ERROR(err
);
539 * Deletes memory (phonebooks or calls) entry.
541 GSM_Error
GSM_AddMemory(GSM_StateMachine
*s
, GSM_MemoryEntry
*entry
)
545 CHECK_PHONE_CONNECTION();
548 err
= s
->Phone
.Functions
->AddMemory(s
, entry
);
549 PRINT_LOG_ERROR(err
);
553 * Deletes memory (phonebooks or calls) entry.
555 GSM_Error
GSM_DeleteMemory(GSM_StateMachine
*s
, GSM_MemoryEntry
*entry
)
559 CHECK_PHONE_CONNECTION();
562 RUN_RESTARTABLE(err
, s
->Phone
.Functions
->DeleteMemory(s
, entry
));
563 PRINT_LOG_ERROR(err
);
567 * Deletes all memory (phonebooks or calls) entries of specified type.
569 GSM_Error
GSM_DeleteAllMemory(GSM_StateMachine
*s
, GSM_MemoryType MemoryType
)
573 CHECK_PHONE_CONNECTION();
575 err
= s
->Phone
.Functions
->DeleteAllMemory(s
, MemoryType
);
576 PRINT_LOG_ERROR(err
);
582 GSM_Error
GSM_GetSpeedDial(GSM_StateMachine
*s
, GSM_SpeedDial
*Speed
)
586 CHECK_PHONE_CONNECTION();
588 err
= s
->Phone
.Functions
->GetSpeedDial(s
, Speed
);
589 PRINT_LOG_ERROR(err
);
595 GSM_Error
GSM_SetSpeedDial(GSM_StateMachine
*s
, GSM_SpeedDial
*Speed
)
599 CHECK_PHONE_CONNECTION();
601 err
= s
->Phone
.Functions
->SetSpeedDial(s
, Speed
);
602 PRINT_LOG_ERROR(err
);
606 * Gets SMS Service Center number and SMS settings.
608 GSM_Error
GSM_GetSMSC(GSM_StateMachine
*s
, GSM_SMSC
*smsc
)
612 CHECK_PHONE_CONNECTION();
614 err
= s
->Phone
.Functions
->GetSMSC(s
, smsc
);
615 PRINT_LOG_ERROR(err
);
619 * Sets SMS Service Center number and SMS settings.
621 GSM_Error
GSM_SetSMSC(GSM_StateMachine
*s
, GSM_SMSC
*smsc
)
625 CHECK_PHONE_CONNECTION();
627 err
= s
->Phone
.Functions
->SetSMSC(s
, smsc
);
628 PRINT_LOG_ERROR(err
);
632 * Gets information about SMS memory (read/unread/size of memory for
633 * both SIM and phone).
635 GSM_Error
GSM_GetSMSStatus(GSM_StateMachine
*s
, GSM_SMSMemoryStatus
*status
)
639 CHECK_PHONE_CONNECTION();
641 err
= s
->Phone
.Functions
->GetSMSStatus(s
, status
);
642 PRINT_LOG_ERROR(err
);
648 GSM_Error
GSM_GetSMS(GSM_StateMachine
*s
, GSM_MultiSMSMessage
*sms
)
652 CHECK_PHONE_CONNECTION();
655 err
= s
->Phone
.Functions
->GetSMS(s
, sms
);
656 PRINT_LOG_ERROR(err
);
660 * Reads next (or first if start set) SMS message. This might be
661 * faster for some phones than using @ref GSM_GetSMS for each message.
663 GSM_Error
GSM_GetNextSMS(GSM_StateMachine
*s
, GSM_MultiSMSMessage
*sms
, gboolean start
)
667 CHECK_PHONE_CONNECTION();
671 err
= s
->Phone
.Functions
->GetNextSMS(s
, sms
, start
);
672 PRINT_LOG_ERROR(err
);
678 GSM_Error
GSM_SetSMS(GSM_StateMachine
*s
, GSM_SMSMessage
*sms
)
682 CHECK_PHONE_CONNECTION();
685 err
= s
->Phone
.Functions
->SetSMS(s
, sms
);
686 PRINT_LOG_ERROR(err
);
690 * Adds SMS to specified folder.
692 GSM_Error
GSM_AddSMS(GSM_StateMachine
*s
, GSM_SMSMessage
*sms
)
696 CHECK_PHONE_CONNECTION();
699 err
= s
->Phone
.Functions
->AddSMS(s
, sms
);
700 PRINT_LOG_ERROR(err
);
706 GSM_Error
GSM_DeleteSMS(GSM_StateMachine
*s
, GSM_SMSMessage
*sms
)
710 CHECK_PHONE_CONNECTION();
713 err
= s
->Phone
.Functions
->DeleteSMS(s
, sms
);
714 PRINT_LOG_ERROR(err
);
720 GSM_Error
GSM_SendSMS(GSM_StateMachine
*s
, GSM_SMSMessage
*sms
)
724 CHECK_PHONE_CONNECTION();
726 err
= s
->Phone
.Functions
->SendSMS(s
, sms
);
727 PRINT_LOG_ERROR(err
);
731 * Sends SMS already saved in phone.
733 GSM_Error
GSM_SendSavedSMS(GSM_StateMachine
*s
, int Folder
, int Location
)
737 CHECK_PHONE_CONNECTION();
738 smprintf(s
, "Location = %d, Folder = %d\n", Location
, Folder
);
740 err
= s
->Phone
.Functions
->SendSavedSMS(s
, Folder
, Location
);
741 PRINT_LOG_ERROR(err
);
745 * Configures fast SMS sending.
747 GSM_Error
GSM_SetFastSMSSending(GSM_StateMachine
*s
, gboolean enable
)
751 CHECK_PHONE_CONNECTION();
753 err
= s
->Phone
.Functions
->SetFastSMSSending(s
, enable
);
754 PRINT_LOG_ERROR(err
);
758 * Enable/disable notification on incoming SMS.
760 GSM_Error
GSM_SetIncomingSMS(GSM_StateMachine
*s
, gboolean enable
)
764 CHECK_PHONE_CONNECTION();
766 err
= s
->Phone
.Functions
->SetIncomingSMS(s
, enable
);
767 PRINT_LOG_ERROR(err
);
771 * Gets network information from phone.
773 GSM_Error
GSM_SetIncomingCB(GSM_StateMachine
*s
, gboolean enable
)
777 CHECK_PHONE_CONNECTION();
779 err
= s
->Phone
.Functions
->SetIncomingCB(s
, enable
);
780 PRINT_LOG_ERROR(err
);
784 * Returns SMS folders information.
786 GSM_Error
GSM_GetSMSFolders(GSM_StateMachine
*s
, GSM_SMSFolders
*folders
)
790 CHECK_PHONE_CONNECTION();
792 err
= s
->Phone
.Functions
->GetSMSFolders(s
, folders
);
793 PRINT_LOG_ERROR(err
);
797 * Creates SMS folder.
799 GSM_Error
GSM_AddSMSFolder(GSM_StateMachine
*s
, unsigned char *name
)
803 CHECK_PHONE_CONNECTION();
805 err
= s
->Phone
.Functions
->AddSMSFolder(s
, name
);
806 PRINT_LOG_ERROR(err
);
810 * Deletes SMS folder.
812 GSM_Error
GSM_DeleteSMSFolder(GSM_StateMachine
*s
, int ID
)
816 CHECK_PHONE_CONNECTION();
818 err
= s
->Phone
.Functions
->DeleteSMSFolder(s
, ID
);
819 PRINT_LOG_ERROR(err
);
823 * Dials number and starts voice call.
825 GSM_Error
GSM_DialVoice(GSM_StateMachine
*s
, char *Number
, GSM_CallShowNumber ShowNumber
)
829 CHECK_PHONE_CONNECTION();
831 err
= s
->Phone
.Functions
->DialVoice(s
, Number
, ShowNumber
);
832 PRINT_LOG_ERROR(err
);
836 * Dials service number (usually for USSD).
838 GSM_Error
GSM_DialService(GSM_StateMachine
*s
, char *Number
)
842 CHECK_PHONE_CONNECTION();
844 err
= s
->Phone
.Functions
->DialService(s
, Number
);
845 PRINT_LOG_ERROR(err
);
849 * Accept current incoming call.
851 GSM_Error
GSM_AnswerCall(GSM_StateMachine
*s
, int ID
, gboolean all
)
855 CHECK_PHONE_CONNECTION();
857 err
= s
->Phone
.Functions
->AnswerCall(s
, ID
, all
);
858 PRINT_LOG_ERROR(err
);
862 * Deny current incoming call.
864 GSM_Error
GSM_CancelCall(GSM_StateMachine
*s
, int ID
, gboolean all
)
868 CHECK_PHONE_CONNECTION();
870 err
= s
->Phone
.Functions
->CancelCall(s
, ID
, all
);
871 PRINT_LOG_ERROR(err
);
877 GSM_Error
GSM_HoldCall(GSM_StateMachine
*s
, int ID
)
881 CHECK_PHONE_CONNECTION();
883 err
= s
->Phone
.Functions
->HoldCall(s
, ID
);
884 PRINT_LOG_ERROR(err
);
890 GSM_Error
GSM_UnholdCall(GSM_StateMachine
*s
, int ID
)
894 CHECK_PHONE_CONNECTION();
896 err
= s
->Phone
.Functions
->UnholdCall(s
, ID
);
897 PRINT_LOG_ERROR(err
);
901 * Initiates a conference call.
903 GSM_Error
GSM_ConferenceCall(GSM_StateMachine
*s
, int ID
)
907 CHECK_PHONE_CONNECTION();
909 err
= s
->Phone
.Functions
->ConferenceCall(s
, ID
);
910 PRINT_LOG_ERROR(err
);
916 GSM_Error
GSM_SplitCall(GSM_StateMachine
*s
, int ID
)
920 CHECK_PHONE_CONNECTION();
922 err
= s
->Phone
.Functions
->SplitCall(s
, ID
);
923 PRINT_LOG_ERROR(err
);
929 GSM_Error
GSM_TransferCall(GSM_StateMachine
*s
, int ID
, gboolean next
)
933 CHECK_PHONE_CONNECTION();
935 err
= s
->Phone
.Functions
->TransferCall(s
, ID
, next
);
936 PRINT_LOG_ERROR(err
);
942 GSM_Error
GSM_SwitchCall(GSM_StateMachine
*s
, int ID
, gboolean next
)
946 CHECK_PHONE_CONNECTION();
948 err
= s
->Phone
.Functions
->SwitchCall(s
, ID
, next
);
949 PRINT_LOG_ERROR(err
);
955 GSM_Error
GSM_GetCallDivert(GSM_StateMachine
*s
, GSM_MultiCallDivert
*divert
)
959 CHECK_PHONE_CONNECTION();
961 err
= s
->Phone
.Functions
->GetCallDivert(s
, divert
);
962 PRINT_LOG_ERROR(err
);
968 GSM_Error
GSM_SetCallDivert(GSM_StateMachine
*s
, GSM_MultiCallDivert
*divert
)
972 CHECK_PHONE_CONNECTION();
974 err
= s
->Phone
.Functions
->SetCallDivert(s
, divert
);
975 PRINT_LOG_ERROR(err
);
979 * Cancels all diverts.
981 GSM_Error
GSM_CancelAllDiverts(GSM_StateMachine
*s
)
985 CHECK_PHONE_CONNECTION();
987 err
= s
->Phone
.Functions
->CancelAllDiverts(s
);
988 PRINT_LOG_ERROR(err
);
992 * Activates/deactivates noticing about incoming calls.
994 GSM_Error
GSM_SetIncomingCall(GSM_StateMachine
*s
, gboolean enable
)
998 CHECK_PHONE_CONNECTION();
1000 err
= s
->Phone
.Functions
->SetIncomingCall(s
, enable
);
1001 PRINT_LOG_ERROR(err
);
1005 * Activates/deactivates noticing about incoming USSDs (UnStructured Supplementary Services).
1007 GSM_Error
GSM_SetIncomingUSSD(GSM_StateMachine
*s
, gboolean enable
)
1011 CHECK_PHONE_CONNECTION();
1013 err
= s
->Phone
.Functions
->SetIncomingUSSD(s
, enable
);
1014 PRINT_LOG_ERROR(err
);
1018 * Sends DTMF (Dual Tone Multi Frequency) tone.
1020 GSM_Error
GSM_SendDTMF(GSM_StateMachine
*s
, char *sequence
)
1024 CHECK_PHONE_CONNECTION();
1026 err
= s
->Phone
.Functions
->SendDTMF(s
, sequence
);
1027 PRINT_LOG_ERROR(err
);
1031 * Gets ringtone from phone.
1033 GSM_Error
GSM_GetRingtone(GSM_StateMachine
*s
, GSM_Ringtone
*Ringtone
, gboolean PhoneRingtone
)
1037 CHECK_PHONE_CONNECTION();
1039 err
= s
->Phone
.Functions
->GetRingtone(s
, Ringtone
, PhoneRingtone
);
1040 PRINT_LOG_ERROR(err
);
1044 * Sets ringtone in phone.
1046 GSM_Error
GSM_SetRingtone(GSM_StateMachine
*s
, GSM_Ringtone
*Ringtone
, int *maxlength
)
1050 CHECK_PHONE_CONNECTION();
1052 err
= s
->Phone
.Functions
->SetRingtone(s
, Ringtone
, maxlength
);
1053 PRINT_LOG_ERROR(err
);
1057 * Acquires ringtone informaiton.
1059 GSM_Error
GSM_GetRingtonesInfo(GSM_StateMachine
*s
, GSM_AllRingtonesInfo
*Info
)
1063 CHECK_PHONE_CONNECTION();
1065 err
= s
->Phone
.Functions
->GetRingtonesInfo(s
, Info
);
1066 PRINT_LOG_ERROR(err
);
1070 * Deletes user defined ringtones from phone.
1072 GSM_Error
GSM_DeleteUserRingtones(GSM_StateMachine
*s
)
1076 CHECK_PHONE_CONNECTION();
1078 err
= s
->Phone
.Functions
->DeleteUserRingtones(s
);
1079 PRINT_LOG_ERROR(err
);
1085 GSM_Error
GSM_PlayTone(GSM_StateMachine
*s
, int Herz
, unsigned char Volume
, gboolean start
)
1089 CHECK_PHONE_CONNECTION();
1091 err
= s
->Phone
.Functions
->PlayTone(s
, Herz
, Volume
, start
);
1092 PRINT_LOG_ERROR(err
);
1096 * Reads WAP bookmark.
1098 GSM_Error
GSM_GetWAPBookmark(GSM_StateMachine
*s
, GSM_WAPBookmark
*bookmark
)
1102 CHECK_PHONE_CONNECTION();
1104 err
= s
->Phone
.Functions
->GetWAPBookmark(s
, bookmark
);
1105 PRINT_LOG_ERROR(err
);
1109 * Sets WAP bookmark.
1111 GSM_Error
GSM_SetWAPBookmark(GSM_StateMachine
*s
, GSM_WAPBookmark
*bookmark
)
1115 CHECK_PHONE_CONNECTION();
1117 err
= s
->Phone
.Functions
->SetWAPBookmark(s
, bookmark
);
1118 PRINT_LOG_ERROR(err
);
1122 * Deletes WAP bookmark.
1124 GSM_Error
GSM_DeleteWAPBookmark(GSM_StateMachine
*s
, GSM_WAPBookmark
*bookmark
)
1128 CHECK_PHONE_CONNECTION();
1130 err
= s
->Phone
.Functions
->DeleteWAPBookmark(s
, bookmark
);
1131 PRINT_LOG_ERROR(err
);
1135 * Acquires WAP settings.
1137 GSM_Error
GSM_GetWAPSettings(GSM_StateMachine
*s
, GSM_MultiWAPSettings
*settings
)
1141 CHECK_PHONE_CONNECTION();
1143 err
= s
->Phone
.Functions
->GetWAPSettings(s
, settings
);
1144 PRINT_LOG_ERROR(err
);
1148 * Changes WAP settings.
1150 GSM_Error
GSM_SetWAPSettings(GSM_StateMachine
*s
, GSM_MultiWAPSettings
*settings
)
1154 CHECK_PHONE_CONNECTION();
1156 err
= s
->Phone
.Functions
->SetWAPSettings(s
, settings
);
1157 PRINT_LOG_ERROR(err
);
1161 * Acquires SyncML settings.
1163 GSM_Error
GSM_GetSyncMLSettings(GSM_StateMachine
*s
, GSM_SyncMLSettings
*settings
)
1167 CHECK_PHONE_CONNECTION();
1169 err
= s
->Phone
.Functions
->GetSyncMLSettings(s
, settings
);
1170 PRINT_LOG_ERROR(err
);
1174 * Changes SyncML settings.
1176 GSM_Error
GSM_SetSyncMLSettings(GSM_StateMachine
*s
, GSM_SyncMLSettings
*settings
)
1180 CHECK_PHONE_CONNECTION();
1182 err
= s
->Phone
.Functions
->SetSyncMLSettings(s
, settings
);
1183 PRINT_LOG_ERROR(err
);
1187 * Acquires chat/presence settings.
1189 GSM_Error
GSM_GetChatSettings(GSM_StateMachine
*s
, GSM_ChatSettings
*settings
)
1193 CHECK_PHONE_CONNECTION();
1195 err
= s
->Phone
.Functions
->GetChatSettings(s
, settings
);
1196 PRINT_LOG_ERROR(err
);
1200 * Changes chat/presence settings.
1202 GSM_Error
GSM_SetChatSettings(GSM_StateMachine
*s
, GSM_ChatSettings
*settings
)
1206 CHECK_PHONE_CONNECTION();
1208 err
= s
->Phone
.Functions
->SetChatSettings(s
, settings
);
1209 PRINT_LOG_ERROR(err
);
1213 * Acquires MMS settings.
1215 GSM_Error
GSM_GetMMSSettings(GSM_StateMachine
*s
, GSM_MultiWAPSettings
*settings
)
1219 CHECK_PHONE_CONNECTION();
1221 err
= s
->Phone
.Functions
->GetMMSSettings(s
, settings
);
1222 PRINT_LOG_ERROR(err
);
1226 * Changes MMS settings.
1228 GSM_Error
GSM_SetMMSSettings(GSM_StateMachine
*s
, GSM_MultiWAPSettings
*settings
)
1232 CHECK_PHONE_CONNECTION();
1234 err
= s
->Phone
.Functions
->SetMMSSettings(s
, settings
);
1235 PRINT_LOG_ERROR(err
);
1239 * Lists MMS folders.
1241 GSM_Error
GSM_GetMMSFolders(GSM_StateMachine
*s
, GSM_MMSFolders
*folders
)
1245 CHECK_PHONE_CONNECTION();
1247 err
= s
->Phone
.Functions
->GetMMSFolders(s
, folders
);
1248 PRINT_LOG_ERROR(err
);
1252 * Retrieves next part of MMS file information.
1254 GSM_Error
GSM_GetNextMMSFileInfo(GSM_StateMachine
*s
, unsigned char *FileID
, int *MMSFolder
, gboolean start
)
1258 CHECK_PHONE_CONNECTION();
1261 err
= s
->Phone
.Functions
->GetNextMMSFileInfo(s
, FileID
, MMSFolder
, start
);
1262 PRINT_LOG_ERROR(err
);
1268 GSM_Error
GSM_GetBitmap(GSM_StateMachine
*s
, GSM_Bitmap
*Bitmap
)
1272 CHECK_PHONE_CONNECTION();
1274 err
= s
->Phone
.Functions
->GetBitmap(s
, Bitmap
);
1275 PRINT_LOG_ERROR(err
);
1281 GSM_Error
GSM_SetBitmap(GSM_StateMachine
*s
, GSM_Bitmap
*Bitmap
)
1285 CHECK_PHONE_CONNECTION();
1287 err
= s
->Phone
.Functions
->SetBitmap(s
, Bitmap
);
1288 PRINT_LOG_ERROR(err
);
1292 * Gets status of ToDos (count of used entries).
1294 GSM_Error
GSM_GetToDoStatus(GSM_StateMachine
*s
, GSM_ToDoStatus
*status
)
1298 CHECK_PHONE_CONNECTION();
1300 err
= s
->Phone
.Functions
->GetToDoStatus(s
, status
);
1301 PRINT_LOG_ERROR(err
);
1305 * Reads ToDo from phone.
1307 GSM_Error
GSM_GetToDo(GSM_StateMachine
*s
, GSM_ToDoEntry
*ToDo
)
1311 CHECK_PHONE_CONNECTION();
1314 err
= s
->Phone
.Functions
->GetToDo(s
, ToDo
);
1315 PRINT_LOG_ERROR(err
);
1319 * Reads ToDo from phone.
1321 GSM_Error
GSM_GetNextToDo(GSM_StateMachine
*s
, GSM_ToDoEntry
*ToDo
, gboolean start
)
1325 CHECK_PHONE_CONNECTION();
1329 err
= s
->Phone
.Functions
->GetNextToDo(s
, ToDo
, start
);
1330 PRINT_LOG_ERROR(err
);
1334 * Sets ToDo in phone.
1336 GSM_Error
GSM_SetToDo(GSM_StateMachine
*s
, GSM_ToDoEntry
*ToDo
)
1340 CHECK_PHONE_CONNECTION();
1343 err
= s
->Phone
.Functions
->SetToDo(s
, ToDo
);
1344 PRINT_LOG_ERROR(err
);
1348 * Adds ToDo in phone.
1350 GSM_Error
GSM_AddToDo(GSM_StateMachine
*s
, GSM_ToDoEntry
*ToDo
)
1354 CHECK_PHONE_CONNECTION();
1357 err
= s
->Phone
.Functions
->AddToDo(s
, ToDo
);
1358 PRINT_LOG_ERROR(err
);
1362 * Deletes ToDo entry in phone.
1364 GSM_Error
GSM_DeleteToDo(GSM_StateMachine
*s
, GSM_ToDoEntry
*ToDo
)
1368 CHECK_PHONE_CONNECTION();
1371 err
= s
->Phone
.Functions
->DeleteToDo(s
, ToDo
);
1372 PRINT_LOG_ERROR(err
);
1376 * Deletes all todo entries in phone.
1378 GSM_Error
GSM_DeleteAllToDo(GSM_StateMachine
*s
)
1382 CHECK_PHONE_CONNECTION();
1384 err
= s
->Phone
.Functions
->DeleteAllToDo(s
);
1385 PRINT_LOG_ERROR(err
);
1389 * Retrieves calendar status (number of used entries).
1391 GSM_Error
GSM_GetCalendarStatus(GSM_StateMachine
*s
, GSM_CalendarStatus
*Status
)
1395 CHECK_PHONE_CONNECTION();
1397 err
= s
->Phone
.Functions
->GetCalendarStatus(s
, Status
);
1398 PRINT_LOG_ERROR(err
);
1402 * Retrieves calendar entry.
1404 GSM_Error
GSM_GetCalendar(GSM_StateMachine
*s
, GSM_CalendarEntry
*Note
)
1408 CHECK_PHONE_CONNECTION();
1409 PRINT_CALENDAR_INFO();
1411 err
= s
->Phone
.Functions
->GetCalendar(s
, Note
);
1412 PRINT_LOG_ERROR(err
);
1416 * Retrieves calendar entry. This is useful for continuous reading of all
1419 GSM_Error
GSM_GetNextCalendar(GSM_StateMachine
*s
, GSM_CalendarEntry
*Note
, gboolean start
)
1423 CHECK_PHONE_CONNECTION();
1425 PRINT_CALENDAR_INFO();
1427 err
= s
->Phone
.Functions
->GetNextCalendar(s
, Note
, start
);
1428 PRINT_LOG_ERROR(err
);
1432 * Sets calendar entry
1434 GSM_Error
GSM_SetCalendar(GSM_StateMachine
*s
, GSM_CalendarEntry
*Note
)
1438 CHECK_PHONE_CONNECTION();
1439 PRINT_CALENDAR_INFO();
1441 err
= s
->Phone
.Functions
->SetCalendar(s
, Note
);
1442 PRINT_LOG_ERROR(err
);
1446 * Adds calendar entry.
1448 GSM_Error
GSM_AddCalendar(GSM_StateMachine
*s
, GSM_CalendarEntry
*Note
)
1452 CHECK_PHONE_CONNECTION();
1453 PRINT_CALENDAR_INFO();
1455 err
= s
->Phone
.Functions
->AddCalendar(s
, Note
);
1456 PRINT_LOG_ERROR(err
);
1460 * Deletes calendar entry.
1462 GSM_Error
GSM_DeleteCalendar(GSM_StateMachine
*s
, GSM_CalendarEntry
*Note
)
1466 CHECK_PHONE_CONNECTION();
1467 PRINT_CALENDAR_INFO();
1469 err
= s
->Phone
.Functions
->DeleteCalendar(s
, Note
);
1470 PRINT_LOG_ERROR(err
);
1474 * Deletes all calendar entries.
1476 GSM_Error
GSM_DeleteAllCalendar(GSM_StateMachine
*s
)
1480 CHECK_PHONE_CONNECTION();
1482 err
= s
->Phone
.Functions
->DeleteAllCalendar(s
);
1483 PRINT_LOG_ERROR(err
);
1487 * Reads calendar settings.
1489 GSM_Error
GSM_GetCalendarSettings(GSM_StateMachine
*s
, GSM_CalendarSettings
*settings
)
1493 CHECK_PHONE_CONNECTION();
1495 err
= s
->Phone
.Functions
->GetCalendarSettings(s
, settings
);
1496 PRINT_LOG_ERROR(err
);
1500 * Sets calendar settings.
1502 GSM_Error
GSM_SetCalendarSettings(GSM_StateMachine
*s
, GSM_CalendarSettings
*settings
)
1506 CHECK_PHONE_CONNECTION();
1508 err
= s
->Phone
.Functions
->SetCalendarSettings(s
, settings
);
1509 PRINT_LOG_ERROR(err
);
1513 * Retrieves notes status (number of used entries).
1515 GSM_Error
GSM_GetNotesStatus(GSM_StateMachine
*s
, GSM_ToDoStatus
*status
)
1519 CHECK_PHONE_CONNECTION();
1521 err
= s
->Phone
.Functions
->GetNotesStatus(s
, status
);
1522 PRINT_LOG_ERROR(err
);
1526 * Retrieves notes entry.
1528 GSM_Error
GSM_GetNote(GSM_StateMachine
*s
, GSM_NoteEntry
*Note
)
1532 CHECK_PHONE_CONNECTION();
1535 err
= s
->Phone
.Functions
->GetNote(s
, Note
);
1536 PRINT_LOG_ERROR(err
);
1540 * Retrieves note entry. This is useful for continuous reading of all
1543 GSM_Error
GSM_GetNextNote(GSM_StateMachine
*s
, GSM_NoteEntry
*Note
, gboolean start
)
1547 CHECK_PHONE_CONNECTION();
1551 err
= s
->Phone
.Functions
->GetNextNote(s
, Note
, start
);
1552 PRINT_LOG_ERROR(err
);
1558 GSM_Error
GSM_SetNote(GSM_StateMachine
*s
, GSM_NoteEntry
*Note
)
1562 CHECK_PHONE_CONNECTION();
1565 err
= s
->Phone
.Functions
->SetNote(s
, Note
);
1566 PRINT_LOG_ERROR(err
);
1572 GSM_Error
GSM_AddNote(GSM_StateMachine
*s
, GSM_NoteEntry
*Note
)
1576 CHECK_PHONE_CONNECTION();
1579 err
= s
->Phone
.Functions
->AddNote(s
, Note
);
1580 PRINT_LOG_ERROR(err
);
1584 * Deletes note entry.
1586 GSM_Error
GSM_DeleteNote(GSM_StateMachine
*s
, GSM_NoteEntry
*Note
)
1590 CHECK_PHONE_CONNECTION();
1593 err
= s
->Phone
.Functions
->DeleteNote(s
, Note
);
1594 PRINT_LOG_ERROR(err
);
1598 * Deletes all notes entries.
1600 GSM_Error
GSM_DeleteAllNotes(GSM_StateMachine
*s
)
1604 CHECK_PHONE_CONNECTION();
1606 err
= s
->Phone
.Functions
->DeleteAllNotes(s
);
1607 PRINT_LOG_ERROR(err
);
1613 GSM_Error
GSM_GetProfile(GSM_StateMachine
*s
, GSM_Profile
*Profile
)
1617 CHECK_PHONE_CONNECTION();
1619 err
= s
->Phone
.Functions
->GetProfile(s
, Profile
);
1620 PRINT_LOG_ERROR(err
);
1626 GSM_Error
GSM_SetProfile(GSM_StateMachine
*s
, GSM_Profile
*Profile
)
1630 CHECK_PHONE_CONNECTION();
1632 err
= s
->Phone
.Functions
->SetProfile(s
, Profile
);
1633 PRINT_LOG_ERROR(err
);
1639 GSM_Error
GSM_GetFMStation(GSM_StateMachine
*s
, GSM_FMStation
*FMStation
)
1643 CHECK_PHONE_CONNECTION();
1645 err
= s
->Phone
.Functions
->GetFMStation(s
, FMStation
);
1646 PRINT_LOG_ERROR(err
);
1652 GSM_Error
GSM_SetFMStation(GSM_StateMachine
*s
, GSM_FMStation
*FMStation
)
1656 CHECK_PHONE_CONNECTION();
1658 err
= s
->Phone
.Functions
->SetFMStation(s
, FMStation
);
1659 PRINT_LOG_ERROR(err
);
1663 * Clears defined FM stations.
1665 GSM_Error
GSM_ClearFMStations(GSM_StateMachine
*s
)
1669 CHECK_PHONE_CONNECTION();
1671 err
= s
->Phone
.Functions
->ClearFMStations(s
);
1672 PRINT_LOG_ERROR(err
);
1676 * Gets next filename from filesystem.
1678 GSM_Error
GSM_GetNextFileFolder(GSM_StateMachine
*s
, GSM_File
*File
, gboolean start
)
1682 CHECK_PHONE_CONNECTION();
1685 err
= s
->Phone
.Functions
->GetNextFileFolder(s
, File
, start
);
1686 PRINT_LOG_ERROR(err
);
1690 * Gets file part from filesystem.
1692 GSM_Error
GSM_GetFolderListing(GSM_StateMachine
*s
, GSM_File
*File
, gboolean start
)
1696 CHECK_PHONE_CONNECTION();
1699 err
= s
->Phone
.Functions
->GetFolderListing(s
, File
, start
);
1700 PRINT_LOG_ERROR(err
);
1704 * Gets next root folder.
1706 GSM_Error
GSM_GetNextRootFolder(GSM_StateMachine
*s
, GSM_File
*File
)
1710 CHECK_PHONE_CONNECTION();
1712 err
= s
->Phone
.Functions
->GetNextRootFolder(s
, File
);
1713 PRINT_LOG_ERROR(err
);
1717 * Sets file system attributes.
1719 GSM_Error
GSM_SetFileAttributes(GSM_StateMachine
*s
, GSM_File
*File
)
1723 CHECK_PHONE_CONNECTION();
1725 err
= s
->Phone
.Functions
->SetFileAttributes(s
, File
);
1726 PRINT_LOG_ERROR(err
);
1730 * Retrieves file part.
1732 GSM_Error
GSM_GetFilePart(GSM_StateMachine
*s
, GSM_File
*File
, int *Handle
, int *Size
)
1736 CHECK_PHONE_CONNECTION();
1738 err
= s
->Phone
.Functions
->GetFilePart(s
, File
, Handle
, Size
);
1739 PRINT_LOG_ERROR(err
);
1743 * Adds file part to filesystem.
1745 GSM_Error
GSM_AddFilePart(GSM_StateMachine
*s
, GSM_File
*File
, int *Pos
, int *Handle
)
1749 CHECK_PHONE_CONNECTION();
1751 err
= s
->Phone
.Functions
->AddFilePart(s
, File
, Pos
, Handle
);
1752 PRINT_LOG_ERROR(err
);
1756 * Sends file to phone, it's up to phone to decide what to do with it.
1758 GSM_Error
GSM_SendFilePart(GSM_StateMachine
*s
, GSM_File
*File
, int *Pos
, int *Handle
)
1762 CHECK_PHONE_CONNECTION();
1764 err
= s
->Phone
.Functions
->SendFilePart(s
, File
, Pos
, Handle
);
1765 PRINT_LOG_ERROR(err
);
1769 * Acquires filesystem status.
1771 GSM_Error
GSM_GetFileSystemStatus(GSM_StateMachine
*s
, GSM_FileSystemStatus
*Status
)
1775 CHECK_PHONE_CONNECTION();
1777 err
= s
->Phone
.Functions
->GetFileSystemStatus(s
, Status
);
1778 PRINT_LOG_ERROR(err
);
1782 * Deletes file from filessytem.
1784 GSM_Error
GSM_DeleteFile(GSM_StateMachine
*s
, unsigned char *ID
)
1788 CHECK_PHONE_CONNECTION();
1790 err
= s
->Phone
.Functions
->DeleteFile(s
, ID
);
1791 PRINT_LOG_ERROR(err
);
1795 * Adds folder to filesystem.
1797 GSM_Error
GSM_AddFolder(GSM_StateMachine
*s
, GSM_File
*File
)
1801 CHECK_PHONE_CONNECTION();
1803 err
= s
->Phone
.Functions
->AddFolder(s
, File
);
1804 PRINT_LOG_ERROR(err
);
1808 * Deletes folder from filesystem.
1810 GSM_Error
GSM_DeleteFolder(GSM_StateMachine
*s
, unsigned char *ID
)
1814 CHECK_PHONE_CONNECTION();
1816 err
= s
->Phone
.Functions
->DeleteFolder(s
, ID
);
1817 PRINT_LOG_ERROR(err
);
1821 * Gets GPRS access point.
1823 GSM_Error
GSM_GetGPRSAccessPoint(GSM_StateMachine
*s
, GSM_GPRSAccessPoint
*point
)
1827 CHECK_PHONE_CONNECTION();
1829 err
= s
->Phone
.Functions
->GetGPRSAccessPoint(s
, point
);
1830 PRINT_LOG_ERROR(err
);
1834 * Sets GPRS access point.
1836 GSM_Error
GSM_SetGPRSAccessPoint(GSM_StateMachine
*s
, GSM_GPRSAccessPoint
*point
)
1840 CHECK_PHONE_CONNECTION();
1842 err
= s
->Phone
.Functions
->SetGPRSAccessPoint(s
, point
);
1843 PRINT_LOG_ERROR(err
);
1848 * Gets phone screenshot
1850 GSM_Error
GSM_GetScreenshot(GSM_StateMachine
*s
, GSM_BinaryPicture
*picture
)
1854 CHECK_PHONE_CONNECTION();
1856 picture
->Length
= 0;
1857 picture
->Buffer
= NULL
;
1860 err
= s
->Phone
.Functions
->GetScreenshot(s
, picture
);
1861 PRINT_LOG_ERROR(err
);
1866 * Gets phone screenshot
1868 GSM_Error
GSM_Install(GSM_StateMachine
*s
, const char *ExtraPath
)
1872 err
= s
->Phone
.Functions
->Install(s
, ExtraPath
);
1873 PRINT_LOG_ERROR(err
);
1877 /* How should editor hadle tabs in this file? Add editor commands here.
1878 * vim: noexpandtab sw=8 ts=8 sts=8: