Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/lintest/myrulib.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKandrashin Denis <mail@lintest.ru>2009-11-06 18:03:22 +0300
committerKandrashin Denis <mail@lintest.ru>2009-11-06 18:03:22 +0300
commit75337b9c5a312e6bcbaf7925e5e9f935c6e9c686 (patch)
treedfa9ea27a7c91678fb6295609c15cdb5b7b4c8f1 /MyRuLib
parent2db6158dec0b4f5f10c5656267bb053ba2aa1195 (diff)
Create download dir
Diffstat (limited to 'MyRuLib')
-rw-r--r--MyRuLib/FbBookPanel.cpp92
-rw-r--r--MyRuLib/FbBookPanel.h3
-rw-r--r--MyRuLib/FbDatabase.cpp5
-rw-r--r--MyRuLib/FbFrameDownld.cpp11
-rw-r--r--MyRuLib/FbFrameDownld.h1
-rw-r--r--MyRuLib/FbParams.h1
-rw-r--r--MyRuLib/SettingsDlg.cpp31
-rw-r--r--MyRuLib/SettingsDlg.h15
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,