vfs: check userland buffers before reading them.
[haiku.git] / src / preferences / time / BaseView.cpp
blob3e096a3045c37264f855bd4c379db52b3a2a896a
1 /*
2 * Copyright 2004-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Mike Berg <mike@berg-net.us>
7 * Julun <host.haiku@gmx.de>
8 */
11 #include "BaseView.h"
13 #include <DateTime.h>
14 #include <OS.h>
16 #include "TimeMessages.h"
19 TTimeBaseView::TTimeBaseView(const char* name)
21 BGroupView(name, B_VERTICAL, 0),
22 fMessage(H_TIME_UPDATE)
24 SetFlags(Flags() | B_PULSE_NEEDED);
28 TTimeBaseView::~TTimeBaseView()
33 void
34 TTimeBaseView::Pulse()
36 if (IsWatched())
37 _SendNotices();
41 void
42 TTimeBaseView::AttachedToWindow()
44 SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
45 SetLowUIColor(ViewUIColor());
49 void
50 TTimeBaseView::ChangeTime(BMessage* message)
52 bool isTime;
53 if (message->FindBool("time", &isTime) != B_OK)
54 return;
56 BDateTime dateTime = BDateTime::CurrentDateTime(B_LOCAL_TIME);
58 if (isTime) {
59 BTime time = dateTime.Time();
60 int32 hour;
61 if (message->FindInt32("hour", &hour) != B_OK)
62 hour = time.Hour();
64 int32 minute;
65 if (message->FindInt32("minute", &minute) != B_OK)
66 minute = time.Minute();
68 int32 second;
69 if (message->FindInt32("second", &second) != B_OK)
70 second = time.Second();
72 time.SetTime(hour, minute, second);
73 dateTime.SetTime(time);
74 } else {
75 BDate date = dateTime.Date();
76 int32 day;
77 if (message->FindInt32("day", &day) != B_OK)
78 day = date.Day();
80 int32 year;
81 if (message->FindInt32("year", &year) != B_OK)
82 year = date.Year();
84 int32 month;
85 if (message->FindInt32("month", &month) != B_OK)
86 month = date.Month();
88 if (year >= 1970 && year <= 2037) {
89 date.SetDate(year, month, day);
90 dateTime.SetDate(date);
94 set_real_time_clock(dateTime.Time_t());
98 void
99 TTimeBaseView::_SendNotices()
101 fMessage.MakeEmpty();
103 BDate date = BDate::CurrentDate(B_LOCAL_TIME);
104 fMessage.AddInt32("day", date.Day());
105 fMessage.AddInt32("year", date.Year());
106 fMessage.AddInt32("month", date.Month());
108 BTime time = BTime::CurrentTime(B_LOCAL_TIME);
109 fMessage.AddInt32("hour", time.Hour());
110 fMessage.AddInt32("minute", time.Minute());
111 fMessage.AddInt32("second", time.Second());
113 SendNotices(H_TM_CHANGED, &fMessage);