diff options
author | Kandrashin Denis <mail@lintest.ru> | 2009-11-06 18:03:22 +0300 |
---|---|---|
committer | Kandrashin Denis <mail@lintest.ru> | 2009-11-06 18:03:22 +0300 |
commit | 75337b9c5a312e6bcbaf7925e5e9f935c6e9c686 (patch) | |
tree | dfa9ea27a7c91678fb6295609c15cdb5b7b4c8f1 /MyRuLib | |
parent | 2db6158dec0b4f5f10c5656267bb053ba2aa1195 (diff) |
Create download dir
Diffstat (limited to 'MyRuLib')
-rw-r--r-- | MyRuLib/FbBookPanel.cpp | 92 | ||||
-rw-r--r-- | MyRuLib/FbBookPanel.h | 3 | ||||
-rw-r--r-- | MyRuLib/FbDatabase.cpp | 5 | ||||
-rw-r--r-- | MyRuLib/FbFrameDownld.cpp | 11 | ||||
-rw-r--r-- | MyRuLib/FbFrameDownld.h | 1 | ||||
-rw-r--r-- | MyRuLib/FbParams.h | 1 | ||||
-rw-r--r-- | MyRuLib/SettingsDlg.cpp | 31 | ||||
-rw-r--r-- | MyRuLib/SettingsDlg.h | 15 |
8 files changed, 120 insertions, 39 deletions
diff --git a/MyRuLib/FbBookPanel.cpp b/MyRuLib/FbBookPanel.cpp index 909d76f9..eb8b5796 100644 --- a/MyRuLib/FbBookPanel.cpp +++ b/MyRuLib/FbBookPanel.cpp @@ -228,40 +228,90 @@ class FbFolderUpdateThread: public wxThread :m_sql(sql), m_folder(folder), m_type(type), m_sql2(sql2) {}; protected: static wxCriticalSection sm_queue; - virtual void ExecSQL(const wxString &sql); + virtual void ExecSQL(FbDatabase &database, const wxString &sql); void * Entry(); - private: wxString m_sql; int m_folder; FbFolderType m_type; wxString m_sql2; }; +class FbCreateDownloadThread: public FbFolderUpdateThread +{ + public: + FbCreateDownloadThread(const wxString &sql, const int folder, const FbFolderType type, const wxString &sql2 = wxEmptyString) + :FbFolderUpdateThread(sql, folder, type, sql2) {}; + protected: + void * Entry(); +}; + wxCriticalSection FbFolderUpdateThread::sm_queue; void * FbFolderUpdateThread::Entry() { wxCriticalSectionLocker locker(sm_queue); - ExecSQL(m_sql); - if (!m_sql2.IsEmpty()) ExecSQL(m_sql2); + FbCommonDatabase database; + database.AttachConfig(); + + ExecSQL(database, m_sql); + if (!m_sql2.IsEmpty()) ExecSQL(database, m_sql2); FbFolderEvent(ID_UPDATE_FOLDER, m_folder, m_type).Post(); return NULL; } -void FbFolderUpdateThread::ExecSQL(const wxString &sql) +void FbFolderUpdateThread::ExecSQL(FbDatabase &database, const wxString &sql) { try { - FbCommonDatabase database; - database.AttachConfig(); database.ExecuteUpdate(sql); } catch (wxSQLite3Exception & e) { wxLogError(e.GetMessage()); } } + +class FbIncrementFunction : public wxSQLite3ScalarFunction +{ + public: + FbIncrementFunction(): m_increment(0) {}; + virtual void Execute(wxSQLite3FunctionContext& ctx); + private: + int m_increment; +}; + +void FbIncrementFunction::Execute(wxSQLite3FunctionContext& ctx) +{ + int argCount = ctx.GetArgCount(); + if (argCount != 1) { + ctx.SetResultError(wxString::Format(_("INCREMENT called with wrong number of arguments: %d."), argCount)); + return; + } + + m_increment++; + int id = ctx.GetInt(0); + id += m_increment; + ctx.SetResult(id); +} + +void * FbCreateDownloadThread::Entry() +{ + wxCriticalSectionLocker locker(sm_queue); + + FbCommonDatabase database; + FbIncrementFunction function; + database.CreateFunction(wxT("INCREMENT"), 1, function); + database.AttachConfig(); + + ExecSQL(database, m_sql); + if (!m_sql2.IsEmpty()) ExecSQL(database, m_sql2); + + FbFolderEvent(ID_UPDATE_FOLDER, m_folder, m_type).Post(); + + return NULL; +} + void FbBookPanel::OnFavoritesAdd(wxCommandEvent & event) { DoFolderAdd( 0 ); @@ -346,20 +396,31 @@ void FbBookPanel::OnChangeRating(wxCommandEvent& event) if ( thread->Create() == wxTHREAD_NO_ERROR ) thread->Run(); } -void FbBookPanel::DoDownload(const wxString &sel, const int folder) +void FbBookPanel::DoDeleteDownload(const wxString &sel, const int folder) { wxString sql1 = wxString::Format(wxT("\ UPDATE states SET download=%d WHERE md5sum IN \ (SELECT DISTINCT md5sum FROM books WHERE id>0 AND id IN (%s)) \ "), folder, sel.c_str()); - wxString sql2 = wxString::Format(wxT("\ + wxThread * thread = new FbFolderUpdateThread( sql1, folder, FT_DOWNLOAD ); + if ( thread->Create() == wxTHREAD_NO_ERROR ) thread->Run(); +} + +void FbBookPanel::DoCreateDownload(const wxString &sel, const int folder) +{ + wxString sql1 = wxString::Format(wxT("\ INSERT INTO states(md5sum, download) \ - SELECT DISTINCT md5sum, %d FROM books WHERE id>0 AND id IN (%s) \ + SELECT DISTINCT md5sum, 1 FROM books WHERE id>0 AND id IN (%s) \ AND NOT EXISTS (SELECT rating FROM states WHERE states.md5sum = books.md5sum) \ + "), sel.c_str()); + + wxString sql2 = wxString::Format(wxT("\ + UPDATE states SET download=INCREMENT(%d) WHERE md5sum IN \ + (SELECT DISTINCT md5sum FROM books WHERE id>0 AND id IN (%s)) \ "), folder, sel.c_str()); - wxThread * thread = new FbFolderUpdateThread( sql1, folder, FT_DOWNLOAD, sql2 ); + wxThread * thread = new FbCreateDownloadThread( sql1, folder, FT_DOWNLOAD, sql2 ); if ( thread->Create() == wxTHREAD_NO_ERROR ) thread->Run(); } @@ -367,15 +428,16 @@ void FbBookPanel::OnDownloadBook(wxCommandEvent & event) { wxString sel; size_t count = m_BookList->GetSelected(sel); - int folder = FbLocalDatabase().NewId(FB_NEW_DOWNLOAD, count); - - DoDownload(sel, folder); + if (count) { + int folder = FbLocalDatabase().NewId(FB_NEW_DOWNLOAD, count) - count + 1; + DoCreateDownload(sel, folder); + } } void FbBookPanel::OnDeleteDownload(wxCommandEvent & event) { wxString sel = m_BookList->GetSelected(); - DoDownload(sel, 0); + DoDeleteDownload(sel, 0); } void FbBookPanel::OnEditComments(wxCommandEvent & event) diff --git a/MyRuLib/FbBookPanel.h b/MyRuLib/FbBookPanel.h index 3465552b..6306b151 100644 --- a/MyRuLib/FbBookPanel.h +++ b/MyRuLib/FbBookPanel.h @@ -32,7 +32,8 @@ class FbBookPanel: public wxSplitterWindow void CreateBookInfo(bool bVertical); private: void DoFolderAdd(const int folder); - void DoDownload(const wxString &sel, const int folder); + void DoCreateDownload(const wxString &sel, const int folder); + void DoDeleteDownload(const wxString &sel, const int folder); int GetRatingColumn(); int UpdateChildRating(wxTreeItemId parent, int iRating, const wxString &sRating); int UpdateSelectionRating(int iRating, const wxString &sRating); diff --git a/MyRuLib/FbDatabase.cpp b/MyRuLib/FbDatabase.cpp index afa225f7..86635ade 100644 --- a/MyRuLib/FbDatabase.cpp +++ b/MyRuLib/FbDatabase.cpp @@ -237,14 +237,15 @@ int FbDatabase::NewId(const int iParam, int iIncrement) if (result.NextRow()) iValue = result.GetInt(0); } - iValue += iIncrement; - { + if (iIncrement) { + iValue += iIncrement; wxString sql = wxString::Format(wxT("INSERT OR REPLACE INTO %s(value, id) VALUES(?,?)"), table); wxSQLite3Statement stmt = PrepareStatement(sql); stmt.Bind(1, iValue); stmt.Bind(2, iParam); stmt.ExecuteUpdate(); } + return iValue; } diff --git a/MyRuLib/FbFrameDownld.cpp b/MyRuLib/FbFrameDownld.cpp index aaae5d1c..711956c4 100644 --- a/MyRuLib/FbFrameDownld.cpp +++ b/MyRuLib/FbFrameDownld.cpp @@ -31,8 +31,8 @@ void FbFrameDownld::CreateControls() wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer( wxVERTICAL ); - wxToolBar * toolbar = CreateToolBar(wxTB_FLAT|wxTB_NODIVIDER|wxTB_HORZ_TEXT, wxID_ANY, GetTitle()); - bSizer1->Add( toolbar, 0, wxGROW); + m_toolbar = CreateToolBar(wxTB_FLAT|wxTB_NODIVIDER|wxTB_HORZ_TEXT, wxID_ANY, wxEmptyString); + bSizer1->Add( m_toolbar, 0, wxGROW); wxSplitterWindow * splitter = new wxSplitterWindow(this, wxID_ANY, wxDefaultPosition, wxSize(500, 400), wxSP_NOBORDER); splitter->SetMinimumPaneSize(50); @@ -134,7 +134,12 @@ void FbFrameDownld::OnFolderSelected(wxTreeEvent & event) if (selected.IsOk()) { m_BooksPanel.EmptyBooks(); FbFolderData * data = (FbFolderData*) m_FolderList->GetItemData(selected); - if (data) FillByFolder(data); + if (data) { + bool enabled = data->GetId() > 0; + m_toolbar->EnableTool(wxID_UP, enabled); + m_toolbar->EnableTool(wxID_DOWN, enabled); + FillByFolder(data); + } } } diff --git a/MyRuLib/FbFrameDownld.h b/MyRuLib/FbFrameDownld.h index e96346b6..d49c39a9 100644 --- a/MyRuLib/FbFrameDownld.h +++ b/MyRuLib/FbFrameDownld.h @@ -31,6 +31,7 @@ private: FbFolderData * GetSelected(); private: FbTreeListCtrl * m_FolderList; + wxToolBar * m_toolbar; private: void OnFavoritesDel(wxCommandEvent & event); void OnFolderAppend(wxCommandEvent & event); diff --git a/MyRuLib/FbParams.h b/MyRuLib/FbParams.h index e65a497a..b8239112 100644 --- a/MyRuLib/FbParams.h +++ b/MyRuLib/FbParams.h @@ -45,6 +45,7 @@ enum FbParamKey { FB_USE_PROXY = 151, FB_PROXY_ADDR = 152, FB_AUTO_DOWNLD = 153, + FB_DOWNLOAD_DIR = 154, }; class ParamItem diff --git a/MyRuLib/SettingsDlg.cpp b/MyRuLib/SettingsDlg.cpp index 1621c372..621ae6f1 100644 --- a/MyRuLib/SettingsDlg.cpp +++ b/MyRuLib/SettingsDlg.cpp @@ -65,8 +65,7 @@ void TypeListCtrl::OnSize(wxSizeEvent& event) /////////////////////////////////////////////////////////////////////////// BEGIN_EVENT_TABLE( SettingsDlg, wxDialog ) - EVT_BUTTON( ID_LIBRARY_DIR_BTN, SettingsDlg::OnSelectFolderClick ) - EVT_BUTTON( ID_WANRAIK_DIR_BTN, SettingsDlg::OnSelectFolderClick ) + EVT_BUTTON( ID_DOWNLOAD_DIR_BTN, SettingsDlg::OnSelectFolderClick ) EVT_BUTTON( ID_EXTERNAL_BTN, SettingsDlg::OnSelectFolderClick ) EVT_MENU( ID_APPEND_TYPE, SettingsDlg::OnAppendType ) EVT_MENU( ID_MODIFY_TYPE, SettingsDlg::OnModifyType ) @@ -135,6 +134,22 @@ SettingsDlg::SettingsDlg( wxWindow* parent, wxWindowID id, const wxString& title bSizer2->Add( bSizer13, 0, wxEXPAND, 5 ); + m_staticText6 = new wxStaticText( m_panel1, wxID_ANY, _("Папка для хранения скачиваемых файлов:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText6->Wrap( -1 ); + bSizer2->Add( m_staticText6, 0, wxTOP|wxLEFT|wxBOTTOM|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer14 = new wxBoxSizer( wxHORIZONTAL ); + + m_textCtrl6 = new wxTextCtrl( m_panel1, ID_DOWNLOAD_DIR_TXT, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_textCtrl6->SetMinSize( wxSize( 300,-1 ) ); + + bSizer14->Add( m_textCtrl6, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton6 = new wxBitmapButton( m_panel1, ID_DOWNLOAD_DIR_BTN, wxArtProvider::GetBitmap(wxART_FOLDER_OPEN), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW ); + bSizer14->Add( m_bpButton6, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + bSizer2->Add( bSizer14, 0, wxEXPAND, 5 ); + m_panel1->SetSizer( bSizer2 ); m_panel1->Layout(); bSizer2->Fit( m_panel1 ); @@ -272,18 +287,16 @@ void SettingsDlg::Assign(bool write) }; const Struct ids[] = { - {DB_LIBRARY_TITLE, SettingsDlg::ID_LIBRARY_TITLE, tText}, - {DB_LIBRARY_DIR, SettingsDlg::ID_LIBRARY_DIR_TXT, tText}, - {DB_WANRAIK_DIR, SettingsDlg::ID_WANRAIK_DIR_TXT, tText}, + {FB_AUTO_DOWNLD, SettingsDlg::ID_AUTO_DOWNLD, tCheck}, + {FB_USE_PROXY, SettingsDlg::ID_USE_PROXY, tCheck}, + {FB_PROXY_ADDR, SettingsDlg::ID_PROXY_ADDR, tCombo}, + {FB_LIBRUSEC_URL, SettingsDlg::ID_LIBRUSEC_URL, tCombo}, + {FB_DOWNLOAD_DIR, SettingsDlg::ID_DOWNLOAD_DIR_TXT, tText}, {FB_EXTERNAL_DIR, SettingsDlg::ID_EXTERNAL_TXT, tText}, {FB_TRANSLIT_FOLDER, SettingsDlg::ID_TRANSLIT_FOLDER, tCheck}, {FB_TRANSLIT_FILE, SettingsDlg::ID_TRANSLIT_FILE, tCheck}, {FB_FOLDER_FORMAT, SettingsDlg::ID_FOLDER_FORMAT, tRadio}, {FB_FILE_FORMAT, SettingsDlg::ID_FILE_FORMAT, tRadio}, - {FB_USE_PROXY, SettingsDlg::ID_USE_PROXY, tCheck}, - {FB_PROXY_ADDR, SettingsDlg::ID_PROXY_ADDR, tCombo}, - {FB_LIBRUSEC_URL, SettingsDlg::ID_LIBRUSEC_URL, tCombo}, - {FB_AUTO_DOWNLD, SettingsDlg::ID_AUTO_DOWNLD, tCheck}, }; const size_t idsCount = sizeof(ids) / sizeof(Struct); diff --git a/MyRuLib/SettingsDlg.h b/MyRuLib/SettingsDlg.h index 176e6add..11cb93a4 100644 --- a/MyRuLib/SettingsDlg.h +++ b/MyRuLib/SettingsDlg.h @@ -22,11 +22,12 @@ class SettingsDlg : private wxDialog DECLARE_EVENT_TABLE() private: enum ID { - ID_LIBRARY_TITLE = 1000, - ID_LIBRARY_DIR_TXT, - ID_LIBRARY_DIR_BTN, - ID_WANRAIK_DIR_TXT, - ID_WANRAIK_DIR_BTN, + ID_AUTO_DOWNLD = 1000, + ID_DOWNLOAD_DIR_TXT, + ID_DOWNLOAD_DIR_BTN, + ID_USE_PROXY, + ID_PROXY_ADDR, + ID_LIBRUSEC_URL, ID_EXTERNAL_TXT, ID_EXTERNAL_BTN, ID_TRANSLIT_FOLDER, @@ -34,10 +35,6 @@ private: ID_FOLDER_FORMAT, ID_FILE_FORMAT, ID_USE_SYMLINKS, - ID_USE_PROXY, - ID_AUTO_DOWNLD, - ID_PROXY_ADDR, - ID_LIBRUSEC_URL, ID_TYPELIST, ID_APPEND_TYPE, ID_MODIFY_TYPE, |