void GSM_DateTimeFromTimestamp(GSM_DateTime *Date, const char *str) { time_t timet; timet = atof(str); Fill_GSM_DateTime(Date, timet); }
gboolean ReadVCALDateTime(const char *Buffer, GSM_DateTime *dt) { time_t timestamp; char year[5]="", month[3]="", day[3]="", hour[3]="", minute[3]="", second[3]=""; memset(dt,0,sizeof(GSM_DateTime)); /* YYYY-MM-DD is invalid, though used */ if (sscanf(Buffer, "%d-%d-%d", &dt->Year, &dt->Month, &dt->Day) == 3) { goto checkdt; } if (strlen(Buffer) < 8) { return FALSE; } strncpy(year, Buffer, 4); strncpy(month, Buffer+4, 2); strncpy(day, Buffer+6, 2); dt->Year = atoi(year); dt->Month = atoi(month); dt->Day = atoi(day); if (Buffer[8] == 'T') { if (strlen(Buffer + 9) < 6) return FALSE; strncpy(hour, Buffer+9, 2); strncpy(minute, Buffer+11, 2); strncpy(second, Buffer+13, 2); dt->Hour = atoi(hour); dt->Minute = atoi(minute); dt->Second = atoi(second); /** * @todo Handle properly timezone information */ if (Buffer[15] == 'Z') dt->Timezone = 0; /* Z = ZULU = GMT */ } checkdt: if (!CheckTime(dt)) { dbgprintf(NULL, "incorrect date %d-%d-%d %d:%d:%d\n",dt->Day,dt->Month,dt->Year,dt->Hour,dt->Minute,dt->Second); return FALSE; } if (dt->Year!=0) { if (!CheckDate(dt)) { dbgprintf(NULL, "incorrect date %d-%d-%d %d:%d:%d\n",dt->Day,dt->Month,dt->Year,dt->Hour,dt->Minute,dt->Second); return FALSE; } } if (dt->Timezone != 0) { timestamp = Fill_Time_T(*dt) + dt->Timezone; Fill_GSM_DateTime(dt, timestamp); } return TRUE; }
void GetTimeDifference(unsigned long diff, GSM_DateTime *DT, gboolean Plus, int multi) { time_t t_time; t_time = Fill_Time_T(*DT); if (Plus) { t_time += diff*multi; } else { t_time -= diff*multi; } Fill_GSM_DateTime(DT, t_time); dbgprintf(NULL, "EndTime: %02i-%02i-%04i %02i:%02i:%02i\n", DT->Day,DT->Month,DT->Year,DT->Hour,DT->Minute,DT->Second); }
GSM_Error GSM_ReadFile(const char *FileName, GSM_File *File) { int i = 1000; FILE *file; struct stat fileinfo; if (FileName[0] == 0x00) return ERR_UNKNOWN; file = fopen(FileName,"rb"); if (file == NULL) return ERR_CANTOPENFILE; free(File->Buffer); File->Buffer = NULL; File->Used = 0; while (i == 1000) { File->Buffer = (unsigned char *)realloc(File->Buffer,File->Used + 1000); i = fread(File->Buffer+File->Used,1,1000,file); File->Used = File->Used + i; } File->Buffer = (unsigned char *)realloc(File->Buffer,File->Used + 1); /* Make it 0 terminated, in case it is needed somewhere (we don't count this to length) */ File->Buffer[File->Used] = 0; fclose(file); File->Level = 0; GSM_IdentifyFileFormat(File); File->Protected = FALSE; File->Hidden = FALSE; File->System = FALSE; File->ReadOnly = FALSE; /* @todo TODO get this from permissions? */ File->Folder = FALSE; File->ModifiedEmpty = TRUE; if (stat(FileName,&fileinfo) == 0) { File->ModifiedEmpty = FALSE; dbgprintf(NULL, "File info read correctly\n"); /* st_mtime is time of last modification of file */ Fill_GSM_DateTime(&File->Modified, fileinfo.st_mtime); dbgprintf(NULL, "FillTime: %s\n", OSDate(File->Modified)); } return ERR_NONE; }
GSM_DateTime GSM_AddTime (GSM_DateTime DT , GSM_DeltaTime delta) { struct tm tm_time; time_t t_time; GSM_DateTime Date; memset(&tm_time, 0, sizeof(tm_time)); tm_time.tm_year = DT.Year - 1900; tm_time.tm_mon = DT.Month - 1; tm_time.tm_mday = DT.Day; tm_time.tm_hour = DT.Hour; tm_time.tm_min = DT.Minute; tm_time.tm_sec = DT.Second; tm_time.tm_isdst = -1; /* TODO: This works only for dates after 1970. But birthday dates may be before, so a more general method than mktime /localtime should be used. */ t_time = mktime (&tm_time); t_time = t_time + delta.Second + 60* (delta.Minute + 60* (delta.Hour + 24*delta.Day)); Fill_GSM_DateTime ( &Date, t_time); return Date; }
void GSM_GetCurrentDateTime (GSM_DateTime *Date) { Fill_GSM_DateTime(Date, time(NULL)); }
GSM_Error DUMMY_GetNextFileFolder(GSM_StateMachine *s, GSM_File *File, gboolean start) { GSM_Phone_DUMMYData *Priv = &s->Phone.Data.Priv.DUMMY; char *path; struct dirent *dp; struct stat sb; int i; if (start) { for (i = 0; i < DUMMY_MAX_FS_DEPTH; i++) { if (Priv->dir[i] != NULL) { closedir(Priv->dir[i]); Priv->dir[i] = NULL; } } path = DUMMY_GetFilePath(s, "fs"); strcpy(Priv->dirnames[0], path); Priv->dir[0] = opendir(path); free(path); path=NULL; if (Priv->dir[0] == NULL) { return DUMMY_Error(s, "opendir failed"); } Priv->fs_depth = 0; } read_next_entry: dp = readdir(Priv->dir[Priv->fs_depth]); if (dp == NULL) { closedir(Priv->dir[Priv->fs_depth]); Priv->dir[Priv->fs_depth] = NULL; if (Priv->fs_depth == 0) return ERR_EMPTY; Priv->fs_depth--; goto read_next_entry; } if (strcmp(dp->d_name, "..") == 0 || strcmp(dp->d_name, ".") == 0) goto read_next_entry; /* Stat file */ path = DUMMY_GetFSPath(s, dp->d_name, Priv->fs_depth); if (stat(path, &sb) < 0) { free(path); path=NULL; return DUMMY_Error(s, "stat failed"); } /* Fill file structure */ File->Used = 0; EncodeUnicode(File->Name, dp->d_name, strlen(dp->d_name)); File->Folder = FALSE; File->Level = Priv->fs_depth + 1; File->Type = GSM_File_Other; /* @todo TODO we should somehow detect this? */ /* We need to skip device prefix and /fs/ prefix */ EncodeUnicode(File->ID_FullName, path + Priv->devlen + 4, strlen(path + Priv->devlen + 4)); File->Buffer = NULL; Fill_GSM_DateTime(&(File->Modified), sb.st_mtime); File->ModifiedEmpty = FALSE; File->Protected = FALSE; File->Hidden = FALSE; File->System = FALSE; File->ReadOnly = FALSE; /* @todo TODO get this from permissions? */ /* Open nested directory for next loop if needed */ if (S_ISDIR(sb.st_mode)) { File->Folder = TRUE; if (Priv->fs_depth == DUMMY_MAX_FS_DEPTH - 1) { smprintf(s, "We hit DUMMY_MAX_FS_DEPTH limit!\n"); free(path); path=NULL; return ERR_MOREMEMORY; } Priv->fs_depth++; Priv->dir[Priv->fs_depth] = opendir(path); if (Priv->dir[Priv->fs_depth] == NULL) { free(path); path=NULL; return DUMMY_Error(s, "nested opendir failed"); } strcpy(Priv->dirnames[Priv->fs_depth], path); } free(path); path=NULL; return ERR_NONE; }