2004-12-14 19:28:23 +03:00
|
|
|
/*
|
2006-05-13 18:11:49 +04:00
|
|
|
* Copyright 2004, Jérôme Duval, jerome.duval@free.fr.
|
2004-12-14 19:28:23 +03:00
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*/
|
|
|
|
|
2006-10-31 03:50:47 +03:00
|
|
|
|
2004-12-14 19:28:23 +03:00
|
|
|
#include <Alert.h>
|
|
|
|
#include <Application.h>
|
|
|
|
#include <FindDirectory.h>
|
|
|
|
#include <MessageRunner.h>
|
|
|
|
#include <Roster.h>
|
|
|
|
#include <String.h>
|
|
|
|
#include <TextView.h>
|
2006-10-31 03:50:47 +03:00
|
|
|
|
2004-12-14 19:28:23 +03:00
|
|
|
#include <stdio.h>
|
2005-11-13 02:27:14 +03:00
|
|
|
#include <stdlib.h>
|
2006-08-03 21:53:43 +04:00
|
|
|
#include <unistd.h>
|
2004-12-14 19:28:23 +03:00
|
|
|
|
2006-10-31 03:50:47 +03:00
|
|
|
|
2004-12-14 19:28:23 +03:00
|
|
|
const uint32 TIMEDALERT_UPDATE = 'taup';
|
|
|
|
|
2006-10-31 03:50:47 +03:00
|
|
|
class TimedAlert : public BAlert {
|
|
|
|
public:
|
|
|
|
TimedAlert(const char *title, const char *text, const char *button1,
|
|
|
|
const char *button2 = NULL, const char *button3 = NULL,
|
|
|
|
button_width width = B_WIDTH_AS_USUAL, alert_type type = B_INFO_ALERT);
|
|
|
|
void MessageReceived(BMessage *);
|
|
|
|
void Show();
|
|
|
|
|
|
|
|
static void GetLabel(BString &string);
|
|
|
|
|
|
|
|
private:
|
|
|
|
BMessageRunner *fRunner;
|
2004-12-14 19:28:23 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
TimedAlert::TimedAlert(const char *title, const char *text, const char *button1,
|
2006-10-31 03:50:47 +03:00
|
|
|
const char *button2, const char *button3,
|
|
|
|
button_width width, alert_type type)
|
2004-12-14 19:28:23 +03:00
|
|
|
: BAlert(title, text, button1, button2, button3, width, type),
|
|
|
|
fRunner(NULL)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
TimedAlert::Show()
|
|
|
|
{
|
2006-10-31 03:50:47 +03:00
|
|
|
fRunner = new BMessageRunner(this, new BMessage(TIMEDALERT_UPDATE), 60000000);
|
2004-12-14 19:28:23 +03:00
|
|
|
BAlert::Show();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
TimedAlert::MessageReceived(BMessage *msg)
|
|
|
|
{
|
|
|
|
if (msg->what == TIMEDALERT_UPDATE) {
|
|
|
|
BString string;
|
|
|
|
GetLabel(string);
|
2006-10-31 03:50:47 +03:00
|
|
|
TextView()->SetText(string.String());
|
2004-12-14 19:28:23 +03:00
|
|
|
} else
|
|
|
|
BAlert::MessageReceived(msg);
|
|
|
|
}
|
|
|
|
|
2006-10-31 03:50:47 +03:00
|
|
|
|
2004-12-14 19:28:23 +03:00
|
|
|
void
|
|
|
|
TimedAlert::GetLabel(BString &string)
|
|
|
|
{
|
2006-10-31 03:50:47 +03:00
|
|
|
string = "Attention!\n\nBecause of the switch from daylight saving time, "
|
|
|
|
"your computer's clock may be an hour off. Currently, your computer "
|
|
|
|
"thinks it is ";
|
|
|
|
|
2004-12-14 19:28:23 +03:00
|
|
|
time_t t;
|
|
|
|
struct tm tm;
|
|
|
|
char timestring[15];
|
|
|
|
time(&t);
|
|
|
|
localtime_r(&t, &tm);
|
|
|
|
strftime(timestring, 15, "%I:%M %p", &tm);
|
|
|
|
string += timestring;
|
2006-10-31 03:50:47 +03:00
|
|
|
|
|
|
|
string += ".\n\nIs this the correct time?";
|
2004-12-14 19:28:23 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-10-31 03:50:47 +03:00
|
|
|
// #pragma mark -
|
|
|
|
|
|
|
|
|
2004-12-14 19:28:23 +03:00
|
|
|
int
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
time_t t;
|
|
|
|
struct tm tm;
|
2005-10-26 17:23:43 +04:00
|
|
|
tzset();
|
2004-12-14 19:28:23 +03:00
|
|
|
time(&t);
|
|
|
|
localtime_r(&t, &tm);
|
|
|
|
|
|
|
|
char path[B_PATH_NAME_LENGTH];
|
|
|
|
if (find_directory(B_USER_SETTINGS_DIRECTORY, -1, true, path, B_PATH_NAME_LENGTH) != B_OK) {
|
|
|
|
fprintf(stderr, "%s: can't find settings directory\n", argv[0]);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
strcat(path, "/time_dststatus");
|
|
|
|
bool newFile = false;
|
|
|
|
bool dst = false;
|
2007-12-11 23:20:45 +03:00
|
|
|
int fd = open(path, O_RDWR | O_EXCL | O_CREAT, S_IRUSR | S_IWUSR);
|
2004-12-14 19:28:23 +03:00
|
|
|
if (fd < 0) {
|
|
|
|
newFile = false;
|
|
|
|
fd = open(path, O_RDWR);
|
|
|
|
if (fd < 0) {
|
|
|
|
perror("couldn't open dst status settings file");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
char dst_byte;
|
|
|
|
read(fd, &dst_byte, 1);
|
|
|
|
|
|
|
|
dst = dst_byte == '1';
|
|
|
|
} else {
|
|
|
|
dst = tm.tm_isdst;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dst != tm.tm_isdst) {
|
|
|
|
BApplication app("application/x-vnd.Haiku-cmd-dstconfig");
|
|
|
|
|
|
|
|
BString string;
|
|
|
|
TimedAlert::GetLabel(string);
|
|
|
|
|
|
|
|
int32 index = (new TimedAlert("timedAlert", string.String(), "Ask me later", "Yes", "No"))->Go();
|
|
|
|
if (index == 0)
|
|
|
|
exit(0);
|
|
|
|
|
|
|
|
if (index == 2) {
|
2006-10-31 03:50:47 +03:00
|
|
|
index = (new BAlert("dstcheck",
|
|
|
|
"Would you like to set the clock using the Time and\nDate preference utility?",
|
2004-12-14 19:28:23 +03:00
|
|
|
"No", "Yes"))->Go();
|
|
|
|
|
|
|
|
if (index == 1)
|
2006-10-31 03:50:47 +03:00
|
|
|
be_roster->Launch("application/x-vnd.Haiku-Time");
|
2004-12-14 19:28:23 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
lseek(fd, 0, SEEK_SET);
|
|
|
|
char dst_byte = tm.tm_isdst ? '1' : '0';
|
|
|
|
write(fd, &dst_byte, 1);
|
|
|
|
close(fd);
|
2006-10-31 03:50:47 +03:00
|
|
|
|
|
|
|
return 0;
|
2004-12-14 19:28:23 +03:00
|
|
|
}
|
|
|
|
|