From 88b0d33b8b0b1f6ae320cfc863ca6a47fa8fec22 Mon Sep 17 00:00:00 2001 From: zautrix Date: Sat, 07 Aug 2004 17:24:40 +0000 Subject: Initial revision --- (limited to 'gammu/emb/common/phone/nokia/nfuncold.c') diff --git a/gammu/emb/common/phone/nokia/nfuncold.c b/gammu/emb/common/phone/nokia/nfuncold.c new file mode 100644 index 0000000..0e40bc6 --- a/dev/null +++ b/gammu/emb/common/phone/nokia/nfuncold.c @@ -0,0 +1,226 @@ +/* (c) 2003 by Marcin Wiacek */ + +#include /* memcpy only */ +#include +#include +#include + +#include "../../misc/coding/coding.h" +#include "../../gsmstate.h" +#include "../../service/sms/gsmsms.h" +#include "../pfunc.h" +#include "nfunc.h" + +#ifdef DEBUG +static void N71_65_GetCalendarAlarm(GSM_StateMachine *s, unsigned char *buffer, GSM_CalendarEntry *entry, int DT, GSM_Phone_Data *Data) +{ + unsigned long diff; + + if (buffer[0] == 0x00 && buffer[1] == 0x00 && buffer[2] == 0xff && buffer[3] == 0xff) { + smprintf(s, "No alarm\n"); + } else { + memcpy(&entry->Entries[entry->EntriesNum].Date,&entry->Entries[DT].Date,sizeof(GSM_DateTime)); + + diff = ((unsigned int)buffer[0]) << 24; + diff += ((unsigned int)buffer[1]) << 16; + diff += ((unsigned int)buffer[2]) << 8; + diff += buffer[3]; + smprintf(s, " Difference : %li seconds\n", diff); + + switch (entry->Type) { + case GSM_CAL_MEETING: + GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, false, 60); + break; + case GSM_CAL_MEMO: + if (!IsPhoneFeatureAvailable(Data->ModelInfo, F_CAL35)) { + GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, false, 60); + break; + } + case GSM_CAL_CALL: + if (!IsPhoneFeatureAvailable(Data->ModelInfo, F_CAL35)) { + GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, false, 60); + break; + } + default: + GetTimeDifference(diff, &entry->Entries[entry->EntriesNum].Date, false, 1); + } + smprintf(s, "Alarm date : %02i-%02i-%04i %02i:%02i:%02i\n", + entry->Entries[entry->EntriesNum].Date.Day, entry->Entries[entry->EntriesNum].Date.Month, + entry->Entries[entry->EntriesNum].Date.Year, entry->Entries[entry->EntriesNum].Date.Hour, + entry->Entries[entry->EntriesNum].Date.Minute,entry->Entries[entry->EntriesNum].Date.Second); + + entry->Entries[entry->EntriesNum].EntryType = CAL_ALARM_DATETIME; + if (entry->Type == GSM_CAL_BIRTHDAY) { + if (buffer[14]!=0x00) entry->Entries[entry->EntriesNum].EntryType = CAL_SILENT_ALARM_DATETIME; + smprintf(s, "Alarm type : Silent\n"); + } + + entry->EntriesNum++; + } +} + +/* method 2 */ +GSM_Error N71_65_ReplyGetNextCalendar2(GSM_Protocol_Message msg, GSM_StateMachine *s) +{ + GSM_DateTime Date; + GSM_CalendarEntry *entry = s->Phone.Data.Cal; + GSM_Phone_Data *Data = &s->Phone.Data; + int i; + unsigned long diff; + + smprintf(s, "Calendar note received method 2\n"); + + if (msg.Length < 10) return ERR_EMPTY; + + entry->Location = msg.Buffer[4]*256 + msg.Buffer[5]; + smprintf(s, "Location: %i\n",entry->Location); + + /* Not birthday */ + if (msg.Buffer[21] != 0x04) { + Date.Year = 2030; Date.Month = 01; Date.Day = 01; + Date.Hour = 00; Date.Minute = 00; Date.Second = 00; + } else { + Date.Year = 2029; Date.Month = 12; Date.Day = 31; + Date.Hour = 22; Date.Minute = 59; Date.Second = 58; + } + diff = ((unsigned int)msg.Buffer[12]) << 24; + diff += ((unsigned int)msg.Buffer[13]) << 16; + diff += ((unsigned int)msg.Buffer[14]) << 8; + diff += msg.Buffer[15]; + smprintf(s, " Difference : %li seconds\n", diff); + GetTimeDifference(diff, &Date, true, 1); + Date.Year += 20; + entry->Entries[0].EntryType = CAL_START_DATETIME; + + smprintf(s, "Note type %02x: ",msg.Buffer[21]); + switch (msg.Buffer[21]) { + case 0x01: + case 0x08: + if (msg.Buffer[21] == 0x01) { + smprintf(s, "Meeting or Reminder\n"); + entry->Type = GSM_CAL_MEETING; + } else { + smprintf(s, "Memo\n"); + Data->Cal->Type = GSM_CAL_MEMO; + } + + memcpy(&entry->Entries[0].Date,&Date,sizeof(GSM_DateTime)); + entry->EntriesNum++; + + N71_65_GetCalendarAlarm(s, msg.Buffer+16, entry, 0, Data); + N71_65_GetCalendarRecurrance(s, msg.Buffer+22, entry); + + memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+30, msg.Buffer[28]*2); + entry->Entries[entry->EntriesNum].Text[msg.Buffer[28]*2] = 0; + entry->Entries[entry->EntriesNum].Text[msg.Buffer[28]*2+1] = 0; + entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT; + break; + case 0x02: + smprintf(s, "Call\n"); + entry->Type = GSM_CAL_CALL; + + memcpy(&entry->Entries[0].Date,&Date,sizeof(GSM_DateTime)); + entry->EntriesNum++; + + N71_65_GetCalendarAlarm(s, msg.Buffer+16, entry, 0, Data); + N71_65_GetCalendarRecurrance(s, msg.Buffer+22, entry); + + i = msg.Buffer[28] * 2; + if (i!=0) { + memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+30, i); + entry->Entries[entry->EntriesNum].Text[i] = 0; + entry->Entries[entry->EntriesNum].Text[i+1] = 0; + entry->Entries[entry->EntriesNum].EntryType = CAL_PHONE; + smprintf(s, "Phone : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text)); + entry->EntriesNum++; + } + + memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+30+i, msg.Buffer[29]*2); + entry->Entries[entry->EntriesNum].Text[msg.Buffer[29]*2] = 0; + entry->Entries[entry->EntriesNum].Text[msg.Buffer[29]*2+1] = 0; + entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT; + break; + case 0x04: + smprintf(s, "Birthday\n"); + Data->Cal->Type = GSM_CAL_BIRTHDAY; + + /* Year was set earlier */ + entry->Entries[0].Date.Month = Date.Month; + entry->Entries[0].Date.Day = Date.Day; + entry->Entries[0].Date.Hour = 23; + entry->Entries[0].Date.Minute = 59; + entry->Entries[0].Date.Second = 58; + entry->EntriesNum++; + + N71_65_GetCalendarAlarm(s, msg.Buffer+16, entry, 0, Data); + N71_65_GetCalendarRecurrance(s, msg.Buffer+22, entry); + + /* Birthday year */ + entry->Entries[0].Date.Year = msg.Buffer[28]*256 + msg.Buffer[29]; + if (msg.Buffer[28] == 0xff && msg.Buffer[29] == 0xff) entry->Entries[0].Date.Year = 0; + smprintf(s, "Birthday date: %02i-%02i-%04i\n", + entry->Entries[0].Date.Day,entry->Entries[0].Date.Month, + entry->Entries[0].Date.Year); + + memcpy(entry->Entries[entry->EntriesNum].Text, msg.Buffer+32, msg.Buffer[31]*2); + entry->Entries[entry->EntriesNum].Text[msg.Buffer[31]*2] = 0; + entry->Entries[entry->EntriesNum].Text[msg.Buffer[31]*2+1] = 0; + entry->Entries[entry->EntriesNum].EntryType = CAL_TEXT; + break; + default: + smprintf(s, "ERROR: unknown %i\n",msg.Buffer[6]); + return ERR_UNKNOWNRESPONSE; + } + smprintf(s, "Text : \"%s\"\n", DecodeUnicodeString(entry->Entries[entry->EntriesNum].Text)); + entry->EntriesNum++; + return ERR_NONE; +} + +/* method 2 */ +/* Note: in known phones texts of notes cut to 50 chars */ +GSM_Error N71_65_GetNextCalendar2(GSM_StateMachine *s, GSM_CalendarEntry *Note, bool start, int *LastCalendarYear, int *LastCalendarPos) +{ + GSM_Error error; + GSM_DateTime date_time; + unsigned char req[] = {N6110_FRAME_HEADER, 0x3e, + 0xFF, 0xFE}; /* Location */ + + if (start) { + /* We have to get current year. It's NOT written in frame for + * Birthday + */ + error=s->Phone.Functions->GetDateTime(s,&date_time); + switch (error) { + case ERR_EMPTY: + case ERR_NOTIMPLEMENTED: + GSM_GetCurrentDateTime(&date_time); + break; + case ERR_NONE: + break; + default: + return error; + } + *LastCalendarYear = date_time.Year; + + /* First location at all */ + req[4] = 0xFF; + req[5] = 0xFE; + } else { + req[4] = *LastCalendarPos / 256; + req[5] = *LastCalendarPos % 256; + } + Note->EntriesNum = 0; + Note->Entries[0].Date.Year = *LastCalendarYear; + + s->Phone.Data.Cal = Note; + smprintf(s, "Getting calendar note method 2\n"); + error=GSM_WaitFor (s, req, 6, 0x13, 4, ID_GetCalendarNote); + *LastCalendarPos = Note->Location; + return error; +} + +#endif + +/* How should editor hadle tabs in this file? Add editor commands here. + * vim: noexpandtab sw=8 ts=8 sts=8: + */ -- cgit v0.9.0.2