/** Set the current time zone @param const int timezone Time zone value to set in minutes. Verify: localtime = UTC + timezone @return bool true if successfull, false if errors (see CGErrorMgr::GetLastWinMsg()) **/ bool CTime::SetTimeZone(const int timezone) { #ifdef WIN32 TIME_ZONE_INFORMATION tzi; if (GetTimeZoneInformation(&tzi) == TIME_ZONE_ID_INVALID) return false; tzi.Bias = -(long)(timezone); if (!SetTimeZoneInformation(&tzi)) return false; return true; #else if (system("tzselect > /var/tmp/tz_out.txt") != 0) { return false; } FILE *f; CString zonename; if ((f = fopen("/var/tmp/tz_out.txt", "r"))) { char buffer[128]; //unsigned long len, cnt = 0; if ( fscanf(f, "%s", buffer) != 1) { fclose (f); return false; } zonename = buffer; fclose (f); } else { return false; } return SetTimeZoneName(zonename); #endif }
/* Property page dialog callback */ INT_PTR CALLBACK DateTimePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { SYSTEMTIME st; GetLocalTime(&st); switch (uMsg) { case WM_INITDIALOG: FillMonthsComboBox(GetDlgItem(hwndDlg, IDC_MONTHCB)); SetTimer(hwndDlg, ID_TIMER, 1000, NULL); /* Set range and current year */ SendMessageW(GetDlgItem(hwndDlg, IDC_YEAR), UDM_SETRANGE, 0, MAKELONG ((short) 9999, (short) 1900)); SendMessageW(GetDlgItem(hwndDlg, IDC_YEAR), UDM_SETPOS, 0, MAKELONG( (short) st.wYear, 0)); pOldWndProc = (WNDPROC) SetWindowLongPtrW(GetDlgItem(hwndDlg, IDC_TIMEPICKER), GWL_WNDPROC, (INT_PTR) DTPProc); break; case WM_TIMER: SendMessageW(GetDlgItem(hwndDlg, IDC_TIMEPICKER), DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM) &st); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_MONTHCB: if (HIWORD(wParam) == CBN_SELCHANGE) { ChangeMonthCalDate(GetDlgItem(hwndDlg, IDC_MONTHCALENDAR), (WORD) -1, GetCBSelectedMonth((HWND)lParam), (WORD) -1); } break; } break; case WM_CTLCOLORSTATIC: if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_YEARTEXT)) return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); break; case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR)lParam; switch (lpnm->idFrom) { case IDC_YEAR: switch (lpnm->code) { case UDN_DELTAPOS: { SHORT wYear; LPNMUPDOWN updown = (LPNMUPDOWN)lpnm; wYear = (SHORT)SendMessageW(GetDlgItem(hwndDlg, IDC_YEAR), UDM_GETPOS, 0, 0); /* Enable the 'Apply' button */ PropSheet_Changed(GetParent(hwndDlg), hwndDlg); ChangeMonthCalDate(GetDlgItem(hwndDlg, IDC_MONTHCALENDAR), (WORD) -1, (WORD) -1, (WORD) (wYear + updown->iDelta)); } break; } break; case IDC_TIMEPICKER: switch (lpnm->code) { case DTN_DATETIMECHANGE: /* Stop the timer */ KillTimer(hwndDlg, ID_TIMER); /* Tell the clock to stop ticking */ SendDlgItemMessageW(hwndDlg, IDC_CLOCKWND, CLM_STOPCLOCK, 0, 0); /* Enable the 'Apply' button */ PropSheet_Changed(GetParent(hwndDlg), hwndDlg); break; } break; case IDC_MONTHCALENDAR: switch (lpnm->code) { case MCCN_SELCHANGE: /* Enable the 'Apply' button */ PropSheet_Changed(GetParent(hwndDlg), hwndDlg); break; case MCCN_AUTOUPDATE: AutoUpdateMonthCal(hwndDlg, (PNMMCCAUTOUPDATE)lpnm); break; } break; default: switch (lpnm->code) { case PSN_SETACTIVE: SetTimeZoneName(hwndDlg); break; case PSN_APPLY: SetLocalSystemTime(hwndDlg); SetTimer(hwndDlg, ID_TIMER, 1000, NULL); /* Tell the clock to start ticking */ SendDlgItemMessageW(hwndDlg, IDC_CLOCKWND, CLM_STARTCLOCK, 0, 0); return TRUE; } break; } } break; case WM_TIMECHANGE: /* FIXME: We don't get this message as we're not a top-level window... */ SendMessageW(GetDlgItem(hwndDlg, IDC_MONTHCALENDAR), MCCM_RESET, 0, 0); break; case WM_DESTROY: KillTimer(hwndDlg, ID_TIMER); break; } return FALSE; }