diff --git a/CHANGELOG b/CHANGELOG index 9c662c4..4744fe9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ -Version 0.9.0 prerelease (2009.09.16): +Version 0.9.0 prerelease (2009.09.17): * added: Pad window - a multiline edit window + * added: Checking for update * changed: precision: Medium - 512 mantissa, 64 exponent Big - 1024 mantissa, 128 exponent diff --git a/src/Makefile b/src/Makefile index 7675147..b184e5e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ include Makefile.dep ttcalc: $(o) - $(CC) -o $(name) $(CFLAGS) $(o) -lcomctl32 + $(CC) -o $(name) $(CFLAGS) $(o) -lcomctl32 -lwininet resource.o: resource.rc diff --git a/src/Makefile.dep b/src/Makefile.dep index d2ee9fb..d9fc72d 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -1,17 +1,19 @@ -o = resource.o calculation.o convert.o functions.o iniparser.o languages.o mainwindow.o pad.o parsermanager.o programresources.o tabs.o variables.o winmain.o +o = resource.o calculation.o convert.o download.o functions.o iniparser.o languages.o mainwindow.o pad.o parsermanager.o programresources.o tabs.o update.o variables.o winmain.o -calculation.o: calculation.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h -convert.o: convert.cpp convert.h compileconfig.h bigtypes.h -functions.o: functions.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h -iniparser.o: iniparser.cpp compileconfig.h iniparser.h -languages.o: languages.cpp compileconfig.h languages.h bigtypes.h -mainwindow.o: mainwindow.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h tabs.h pad.h +calculation.o: calculation.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h +convert.o: convert.cpp convert.h compileconfig.h bigtypes.h +download.o: download.cpp download.h +functions.o: functions.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h +iniparser.o: iniparser.cpp compileconfig.h iniparser.h +languages.o: languages.cpp compileconfig.h languages.h bigtypes.h +mainwindow.o: mainwindow.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h tabs.h pad.h update.h download.h pad.o: pad.cpp programresources.h compileconfig.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h -parsermanager.o: parsermanager.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h -programresources.o: programresources.cpp compileconfig.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h +parsermanager.o: parsermanager.cpp compileconfig.h parsermanager.h resource.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.h messages.h +programresources.o: programresources.cpp compileconfig.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h tabs.o: tabs.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h -variables.o: variables.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h -winmain.o: winmain.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h tabs.h pad.h +update.o: update.cpp update.h download.h programresources.h compileconfig.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h messages.h resource.h winmain.h tabs.h pad.h +variables.o: variables.cpp compileconfig.h tabs.h resource.h messages.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h +winmain.o: winmain.cpp compileconfig.h winmain.h programresources.h iniparser.h languages.h bigtypes.h threadcontroller.h stopcalculating.h convert.h resource.h messages.h tabs.h pad.h .SUFFIXES: .cpp .o diff --git a/src/download.cpp b/src/download.cpp new file mode 100644 index 0000000..9a09c4a --- /dev/null +++ b/src/download.cpp @@ -0,0 +1,148 @@ + +/* + * This file is a part of TTCalc - a mathematical calculator + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2009, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name Tomasz Sowa nor the names of contributors to this + * project may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "download.h" + + +Download::Download() +{ + buffer_len = 512; + progress = 0; + + buffer = new char[buffer_len]; +} + + +Download::~Download() +{ + if( buffer ) + delete [] buffer; +} + + +void Download::SetProgress() +{ + if( !progress ) + return; + + SendMessage(progress, PBM_SETRANGE32, 0, all_len); + SendMessage(progress, PBM_SETPOS, 0, 0); +} + + +void Download::ChangeProgress(size_t size) +{ + if( !progress ) + return; + + SendMessage(progress, PBM_SETPOS, size, 0); +} + + + +void Download::ClearProgress() +{ + if( !progress ) + return; + + SendMessage(progress, PBM_SETPOS, 0, 0); +} + + + +bool Download::DownloadUrl(const char * url) +{ +DWORD read; +bool res = true; +size_t down_size = 0; + + HINTERNET hint = InternetOpen("TTCalcDownload",INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0); + if( !hint ) + return false; + + HINTERNET conn = InternetOpenUrl(hint, url, 0, 0, + INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_UI, 0); + + if( conn ) + { + GetLen(conn); + SetProgress(); + + if( Init() ) + { + while( InternetReadFile(conn, buffer, buffer_len, &read) && read > 0 ) + { + down_size += read; + ChangeProgress(down_size); + + if( !Read(buffer, read) ) + { + res = false; + break; + } + } + + Close(); + ClearProgress(); + } + + InternetCloseHandle(conn); + } + else + { + res = false; + } + + InternetCloseHandle(hint); + +return res; +} + + + + + + + + + + + + + + diff --git a/src/download.h b/src/download.h new file mode 100644 index 0000000..095927a --- /dev/null +++ b/src/download.h @@ -0,0 +1,71 @@ +/* + * This file is a part of TTCalc - a mathematical calculator + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2009, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name Tomasz Sowa nor the names of contributors to this + * project may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef headerfiledownload +#define headerfiledownload + +#include +#include +#include + +class Download +{ +public: + + Download(); + ~Download(); + + bool DownloadUrl(const char * url); + void AttachProgress(HWND p) { progress = p; } + +protected: + virtual void GetLen(HINTERNET conn) { all_len = 0; } + virtual bool Init() { return false; } + virtual bool Read(char * buffer, size_t size) { return false; } + virtual void Close() {} + virtual void SetProgress(); + virtual void ChangeProgress(size_t size); + virtual void ClearProgress(); + + char * buffer; + size_t buffer_len; + size_t all_len; + HWND progress; +}; + + +#endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8bff68c..cb36b91 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -37,7 +37,7 @@ #include "compileconfig.h" #include "winmain.h" - +#include "update.h" @@ -915,6 +915,16 @@ return true; } +BOOL WmCommand_HelpCheckUpdate(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + ShowUpdateDialog(hWnd); + +return true; +} + + + + BOOL WmCommand_NewWindow(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { STARTUPINFO si; @@ -1178,6 +1188,7 @@ void CreateCommandMessagesTable(Messages & cmessages) cmessages.Associate(IDM_COMPACT_VIEW, WmCommand_CompactView); cmessages.Associate(IDM_PAD, WmCommand_Pad); cmessages.Associate(IDM_HELP_ABOUT, WmCommand_HelpAbout); + cmessages.Associate(IDM_HELP_CHECK_UPDATE, WmCommand_HelpCheckUpdate); cmessages.Associate(IDM_NEW_WINDOW, WmCommand_NewWindow); cmessages.Associate(IDM_CLOSE_PROGRAM, WmCommand_CloseProgram); cmessages.Associate(IDC_INPUT_EDIT, WmCommand_InputEditNotify); diff --git a/src/resource.h b/src/resource.h index d7fea6f..13fe85e 100644 --- a/src/resource.h +++ b/src/resource.h @@ -50,6 +50,7 @@ #define IDD_MAIN_DIALOG 101 #define IDD_ABOUT_DIALOG 200 +#define IDD_UPDATE_DIALOG 210 #define IDD_DIALOG_ADD_VARIABLE 102 #define IDD_DIALOG_ADD_FUNCTION 103 @@ -206,10 +207,16 @@ #define IDM_EDIT_COPY_RESULT 40032 #define IDM_HELP_HELP 40040 #define IDM_HELP_PROJECT_PAGE 40041 +#define IDM_HELP_CHECK_UPDATE 40042 #define IDM_HELP_ABOUT 40049 // about dialog #define IDC_ABOUT_TEXT 1200 #define IDB_BITMAP_ABOUT 1201 +// update dialog +#define IDC_UPDATE_INFO1 1300 +#define IDC_PROGRESS 1301 + + #endif diff --git a/src/resource.rc b/src/resource.rc index ed603af..12c70d8 100644 --- a/src/resource.rc +++ b/src/resource.rc @@ -49,6 +49,7 @@ BEGIN BEGIN MENUITEM "&Help", 40040 MENUITEM "&Project page", 40041 + MENUITEM "&Check update...", 40042 MENUITEM SEPARATOR MENUITEM "&About", 40049 END @@ -282,6 +283,20 @@ BEGIN END #endif +IDD_UPDATE_DIALOG DIALOG DISCARDABLE 0, 0, 256, 86 +STYLE DS_MODALFRAME | WS_POPUP +FONT 8, "MS Sans Serif" +BEGIN + CONTROL "Checking for update",IDC_UPDATE_INFO1,"Static",SS_LEFTNOWORDWRAP | + WS_GROUP,7,14,242,8 + + CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER, + 7,33,242,14 + DEFPUSHBUTTON "Next",IDOK,146,65,50,14 + PUSHBUTTON "Cancel",IDCANCEL,199,65,50,14 +END + + #ifndef TTCALC_PORTABLE 1201 BITMAP "..\\res\\abacus_01.bmp" diff --git a/src/update.cpp b/src/update.cpp new file mode 100644 index 0000000..55e5b9a --- /dev/null +++ b/src/update.cpp @@ -0,0 +1,452 @@ +/* + * This file is a part of TTCalc - a mathematical calculator + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2009, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name Tomasz Sowa nor the names of contributors to this + * project may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include +#include "update.h" +#include "programresources.h" +#include "messages.h" +#include "resource.h" +#include "winmain.h" + + +namespace Update +{ + bool continue_download; + int level; + std::string url; + std::string download_file_name; + int major; + int minor; + int revision; +} + + +/* + + + +*/ +DownloadIni::DownloadIni() +{ + file = 0; + file_name = new char[MAX_PATH]; + file_name[0] = 0; +} + + +DownloadIni::~DownloadIni() +{ + if( file ) + fclose(file); + + DeleteTmpFile(); + + delete [] file_name; +} + + +void DownloadIni::DeleteTmpFile() +{ + if( file_name[0] != 0 ) + DeleteFile(file_name); +} + +const char * DownloadIni::GetFileName() +{ + return file_name; +} + + +FILE * DownloadIni::CreateTmpFile() +{ +char buf[MAX_PATH]; + + file = 0; + file_name[0] = 0; + + if( !GetTempPath(MAX_PATH, buf) ) + return 0; + + + if( !GetTempFileName(buf, "ttcalc_", 0, file_name) ) + { + file_name[0] = 0; + return 0; + } + + file = fopen(file_name, "wb"); + +return file; +} + +void DownloadIni::GetLen(HINTERNET conn) +{ +char buf[100]; +DWORD buf_len = sizeof(buf); +DWORD index = 0; + + if( HttpQueryInfo(conn, HTTP_QUERY_CONTENT_LENGTH, buf, &buf_len, &index) ) + all_len = atoi(buf); + else + all_len = 0; +} + + + +bool DownloadIni::Init() +{ + if( !CreateTmpFile() ) + return false; + + Update::continue_download = true; + +return true; +} + + + +bool DownloadIni::Read(char * buffer, size_t size) +{ + if( !file ) + return false; + + fwrite(buffer, size, 1, file); + CheckMessages(); + +return Update::continue_download; +} + + + +void DownloadIni::Close() +{ + if( file ) + fclose(file); + + file = 0; +} + + + + + + +/* + + + +*/ + + +void DownloadProgram::GetLen(HINTERNET conn) +{ +char buf[100]; +DWORD buf_len = sizeof(buf); +DWORD index = 0; + + if( HttpQueryInfo(conn, HTTP_QUERY_CONTENT_LENGTH, buf, &buf_len, &index) ) + all_len = atoi(buf); + else + all_len = 0; +} + + +bool DownloadProgram::Init() +{ + file.open(Update::download_file_name.c_str(), std::ios_base::out | std::ios_base::binary); + Update::continue_download = true; + + if( !file ) + return false; + +return true; +} + + + +bool DownloadProgram::Read(char * buffer, size_t size) +{ + file.write(buffer, size); + CheckMessages(); + +return Update::continue_download; +} + + + +void DownloadProgram::Close() +{ + file.close(); +} + + + + +namespace Update +{ +/* + + + +*/ + +bool CheckUpdateFromIni(HWND hwnd) +{ +DownloadIni down_ini; + + down_ini.AttachProgress(GetDlgItem(hwnd, IDC_PROGRESS)); + if( down_ini.DownloadUrl("http://ttcalc.sourceforge.net/ttcalc.ini") ) + { + IniParser iparser; + std::string ini_value[3]; + + iparser.SectionCaseSensitive(false); + iparser.Associate( "normal|url", &url ); + iparser.Associate( "normal|version.major", &ini_value[0] ); + iparser.Associate( "normal|version.minor", &ini_value[1] ); + iparser.Associate( "normal|version.revision", &ini_value[2] ); + + IniParser::Error err = iparser.ReadFromFile( down_ini.GetFileName() ); + + if( err == IniParser::err_ok ) + { + major = atoi(ini_value[0].c_str()); + minor = atoi(ini_value[1].c_str()); + revision = atoi(ini_value[2].c_str()); + + if( major > TTCALC_MAJOR_VER ) + return true; + else + if( major == TTCALC_MAJOR_VER && minor > TTCALC_MINOR_VER ) + return true; + else + if( major == TTCALC_MAJOR_VER && minor == TTCALC_MINOR_VER && revision > TTCALC_REVISION_VER ) + return true; + } + } + +return false; +} + +void CheckUpdate(HWND hwnd) +{ +char buffer[200]; + + EnableWindow(GetDlgItem(hwnd, IDOK), false); + EnableWindow(GetDlgItem(hwnd, IDC_UPDATE_INFO1), false); + + if( CheckUpdateFromIni(hwnd) ) + { + level = 1; + sprintf(buffer, "Version %d.%d.%d is available, press Next to download...", major, minor, revision); + SetDlgItemText(hwnd, IDC_UPDATE_INFO1, buffer); + } + else + { + level = 100; + SetDlgItemText(hwnd, IDC_UPDATE_INFO1, "There is not a new version available."); + SetDlgItemText(hwnd, IDOK, "Finish"); + ShowWindow(GetDlgItem(hwnd, IDC_PROGRESS), SW_HIDE); + EnableWindow(GetDlgItem(hwnd, IDCANCEL), false); + } + + EnableWindow(GetDlgItem(hwnd, IDOK), true); + EnableWindow(GetDlgItem(hwnd, IDC_UPDATE_INFO1), true); +} + + +bool SaveDialog(HWND hwnd) +{ +OPENFILENAME o; +char buf[MAX_PATH]; + + strcpy(buf, "TTCalc_setup.exe"); + + o.lStructSize = sizeof(o); + o.hwndOwner = hwnd; + o.hInstance = GetPrgRes()->GetInstance(); + o.lpstrFilter = "*.*\0*.*\0"; + o.lpstrCustomFilter = 0; + o.nMaxCustFilter = 0; + o.nFilterIndex = 1; + o.lpstrFile = buf; + o.nMaxFile = MAX_PATH; + o.lpstrFileTitle = 0; + o.nMaxFileTitle = 0; + o.lpstrInitialDir = 0; // dac pulpit + o.lpstrTitle = 0; + o.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST; + o.nFileOffset = 0; + o.nFileExtension = 0; + o.lpstrDefExt = 0; + o.lCustData = 0; + o.lpfnHook = 0; + o.lpTemplateName = 0; + + + if( GetSaveFileName(&o) ) + { + download_file_name = buf; + return true; + } + +return false; +} + + + +bool DownloadUpdate(HWND hwnd) +{ +DownloadProgram down; +char buf[300]; + + EnableWindow(GetDlgItem(hwnd, IDOK), false); + + if( SaveDialog(hwnd) ) + { + _snprintf(buf, 100, "Downloading: %s", url.c_str()); + SetDlgItemText(hwnd, IDC_UPDATE_INFO1, buf); + + down.AttachProgress(GetDlgItem(hwnd, IDC_PROGRESS)); + + if( down.DownloadUrl( url.c_str()) ) + { + SetDlgItemText(hwnd, IDC_UPDATE_INFO1, "File has been correctly saved."); + } + else + { + DeleteFile(download_file_name.c_str()); + SetDlgItemText(hwnd, IDC_UPDATE_INFO1, "There was a problem with downloading, please try again later"); + } + + ShowWindow(GetDlgItem(hwnd, IDC_PROGRESS), SW_HIDE); + SetDlgItemText(hwnd, IDOK, "Finish"); + level = 100; + } + + EnableWindow(GetDlgItem(hwnd, IDOK), true); + EnableWindow(GetDlgItem(hwnd, IDCANCEL), false); + +return false; +} + + + + + + + + +BOOL UpdateInit(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + SetDlgItemText(hwnd, IDC_UPDATE_INFO1, "Press Next to check for the update..."); + SetDlgItemText(hwnd, IDOK, "Next"); + SetDlgItemText(hwnd, IDCANCEL, "Cancel"); + +return true; +} + + +BOOL UpdateCommand(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if( LOWORD(wParam) == IDCANCEL ) + { + continue_download = false; + EndDialog(hwnd, 0); + return 0; + } + + if( LOWORD(wParam) == IDOK ) + { + switch(level) + { + case 0: + CheckUpdate(hwnd); + break; + + case 1: + DownloadUpdate(hwnd); + break; + + case 100: + EndDialog(hwnd, 0); + break; + } + return 0; + } + + return 1; +} + + +void CreateUpdateMessagesTable(Messages & messages) +{ + messages.Associate(WM_INITDIALOG, UpdateInit); + messages.Associate(WM_COMMAND, UpdateCommand); +} + + +BOOL CALLBACK UpdateProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ +static Messages messages; + + if( messages.Empty() ) + // initiation + CreateUpdateMessagesTable(messages); + +return messages.Call(msg, hwnd, msg, wParam, lParam); +} + + +} // namespace + + + +void ShowUpdateDialog(HWND hwnd) +{ +using namespace Update; + + level = 0; + download_file_name.clear(); + DialogBox(GetPrgRes()->GetInstance(), MAKEINTRESOURCE(IDD_UPDATE_DIALOG), hwnd, UpdateProc); + +} + + + + diff --git a/src/update.h b/src/update.h new file mode 100644 index 0000000..b51766a --- /dev/null +++ b/src/update.h @@ -0,0 +1,83 @@ +/* + * This file is a part of TTCalc - a mathematical calculator + * and is distributed under the (new) BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2006-2009, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name Tomasz Sowa nor the names of contributors to this + * project may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef headerfileupdate +#define headerfileupdate + +#include +#include +#include +#include "download.h" + + +void ShowUpdateDialog(HWND hwnd); + + + +class DownloadIni : public Download +{ +public: + DownloadIni(); + ~DownloadIni(); + void DeleteTmpFile(); + const char * GetFileName(); + +private: + + FILE * CreateTmpFile(); + virtual void GetLen(HINTERNET conn); + virtual bool Init(); + virtual bool Read(char * buffer, size_t size); + virtual void Close(); + + char * file_name; + FILE * file; +}; + +class DownloadProgram : public Download +{ + virtual void GetLen(HINTERNET conn); + virtual bool Init(); + virtual bool Read(char * buffer, size_t size); + virtual void Close(); + + std::ofstream file; +}; + + + +#endif diff --git a/src/winmain.cpp b/src/winmain.cpp index 13342c5..9782cde 100644 --- a/src/winmain.cpp +++ b/src/winmain.cpp @@ -128,6 +128,66 @@ return static_cast( error_code ); +void SendMessage(MSG & msg) +{ +bool sent = false; + + // if there's CTRL+C or CTRL+V pressed we're trying to copy + // a result from the output edit or trying to paste something from the clipboard + if( msg.message==WM_KEYDOWN && (GetKeyState(VK_CONTROL) & 0xff00)!=0 ) + { + if( msg.wParam == 'C' ) + { + if( MainWindowFunctions::CopyResult() ) + sent = true; + } + else + if( msg.wParam == 'V' ) + { + if( MainWindowFunctions::Paste() ) + sent = true; + } + } + + + // we give our own special function for navigating from the keyboard + // if our function returns false then we use a standard navigation + // from the system + if( !sent && msg.message == WM_KEYDOWN && + ( msg.wParam == VK_TAB || + msg.wParam == VK_DOWN || msg.wParam == VK_UP || + msg.wParam == VK_LEFT || msg.wParam == VK_DOWN ) ) + + { + if( MainWindowFunctions::SetNextFocus(msg.wParam) ) + sent = true; + } + + + // firt we try to send our message to dialogs + // (the dialogs on the tab control) + if( !sent ) + { + for(unsigned int i=0 ; iHowManyTabWindows() && !sent ; ++i) + { + if( IsDialogMessage(GetPrgRes()->GetTabWindow(i), &msg) ) + sent = true; + } + } + + // if it's not a message to any of our dialogs we send it + // to the main window (it's a dialog as well) + if( !sent ) + { + if( !IsDialogMessage(GetPrgRes()->GetMainWindow(), &msg) ) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } +} + + /*! the main loop of messages */ @@ -136,66 +196,21 @@ void MainMessagesLoop() MSG msg; while( GetMessage(&msg,0,0,0) ) - { - bool sent = false; - - // if there's CTRL+C or CTRL+V pressed we're trying to copy - // a result from the output edit or trying to paste something from the clipboard - if( msg.message==WM_KEYDOWN && (GetKeyState(VK_CONTROL) & 0xff00)!=0 ) - { - if( msg.wParam == 'C' ) - { - if( MainWindowFunctions::CopyResult() ) - sent = true; - } - else - if( msg.wParam == 'V' ) - { - if( MainWindowFunctions::Paste() ) - sent = true; - } - } - - - // we give our own special function for navigating from the keyboard - // if our function returns false then we use a standard navigation - // from the system - if( !sent && msg.message == WM_KEYDOWN && - ( msg.wParam == VK_TAB || - msg.wParam == VK_DOWN || msg.wParam == VK_UP || - msg.wParam == VK_LEFT || msg.wParam == VK_DOWN ) ) - - { - if( MainWindowFunctions::SetNextFocus(msg.wParam) ) - sent = true; - } - - - // firt we try to send our message to dialogs - // (the dialogs on the tab control) - if( !sent ) - { - for(unsigned int i=0 ; iHowManyTabWindows() && !sent ; ++i) - { - if( IsDialogMessage(GetPrgRes()->GetTabWindow(i), &msg) ) - sent = true; - } - } - - // if it's not a message to any of our dialogs we send it - // to the main window (it's a dialog as well) - if( !sent ) - { - if( !IsDialogMessage(GetPrgRes()->GetMainWindow(), &msg) ) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - } + SendMessage(msg); } + +void CheckMessages() +{ +MSG msg; + + while( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) ) + SendMessage(msg); +} + + + /*! the window-procedure for the main window */ diff --git a/src/winmain.h b/src/winmain.h index 9f8b23c..d45a208 100644 --- a/src/winmain.h +++ b/src/winmain.h @@ -60,7 +60,7 @@ BOOL CALLBACK MainWindowProc(HWND hWnd, UINT messge, WPARAM wParam, LPARAM lPara unsigned __stdcall CalculationsProcedure(void *); int ShowError( Languages::GuiMsg error_code ); void MainMessagesLoop(); - +void CheckMessages(); namespace MainWindowFunctions {