source: trunk/src/NewTorrentDialog.cpp @ 647

Revision 647, 11.7 KB checked in by Eoin, 11 years ago (diff)
Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2008.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#include "stdAfx.hpp"
8#include "../res/resource.h"
9
10#include "ProgressDialog.hpp"
11#include "CSSFileDialog.hpp"
12
13#include "NewTorrentDialog.hpp"
14#include "NewTorrentPeers.hpp"
15
16void DetailsSheet::OnOutBrowse(UINT, int, HWND hWnd)
17{       
18        CSSFileDialog dlgOpen(false, NULL, NULL, OFN_HIDEREADONLY, L"Torrents. (*.torrent)|*.torrent|All Files (*.*)|*.*|", m_hWnd);
19
20        if (dlgOpen.DoModal() == IDOK) 
21        {
22                SetDlgItemText(HAL_NEWT_FILE, dlgOpen.m_ofn.lpstrFile);
23                EnableSave_(true);
24        }
25}
26
27LRESULT DetailsSheet::onInitDialog(HWND, LPARAM)
28{       
29        creator_ = L"Halite " + hal::app().res_wstr(HAL_VERSION_STRING);
30
31        pieceSize_ = 256;
32
33        BOOL retval =  DoDataExchange(false);
34        return 0;
35}
36
37wstring DetailsSheet::Creator() 
38{ 
39        DoDataExchange(true);
40        return creator_; 
41}
42
43wstring DetailsSheet::Comment() 
44{       
45        DoDataExchange(true);
46        return comment_; 
47}
48
49int DetailsSheet::PieceSize()
50{ 
51        DoDataExchange(true);
52        return pieceSize_; 
53}
54
55bool DetailsSheet::Private() 
56{ 
57        DoDataExchange(true);
58        return private_;
59}
60
61void FilesListViewCtrl::OnAttach()
62{
63        InitialSetup();         
64
65        std::vector<wstring> names;     
66        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
67
68        // "Tracker;Tier"
69        boost::split(names, column_names, boost::is_any_of(L";"));
70       
71        array<int, 3> widths = {50,287,50};
72        array<int, 3> order = {0,1,2};
73        array<bool, 3> visible = {true,true,true};
74       
75        for (int i=0, e=3; i < e; ++i)
76        {
77                AddColumn(names[i].c_str(), i, visible[i], widths[i]);
78        }       
79
80        load_from_ini();
81       
82        SetColumnSortType(0, WTL::LVCOLSORT_TEXTNOCASE);
83        SetColumnSortType(1, WTL::LVCOLSORT_TEXTNOCASE);
84        SetColumnSortType(2, WTL::LVCOLSORT_LONG);
85}
86
87void FilesListViewCtrl::OnDestroy()
88{
89        saveSettings();
90}
91
92void FilesListViewCtrl::saveSettings()
93{               
94        GetListViewDetails();
95        save_to_ini();
96}
97
98void recurseDirectory(std::vector<wpath>& files, wpath baseDir, wpath relDir)
99{       
100        hal::event_log.post(shared_ptr<hal::EventDetail>(
101                new hal::EventMsg(hal::wform(L"recursing %1%  /  %2%") % baseDir.file_string() % relDir.file_string())));               
102
103        wpath currentDir(baseDir / relDir);
104
105        if (hal::fs::is_directory(currentDir))
106    {
107                for (hal::fs::wdirectory_iterator i(currentDir), end; i != end; ++i)
108                        recurseDirectory(files, baseDir, relDir / i->filename());
109    }
110    else
111    {
112                files.push_back(relDir);               
113    }
114}
115
116void FilesSheet::OnFileBrowse(UINT, int, HWND hWnd)
117{       
118        CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"All Files (*.*)|*.*|", m_hWnd);
119
120        if (dlgOpen.DoModal() == IDOK) 
121        {
122                files_.clear();
123                wpath file = wpath(dlgOpen.m_ofn.lpstrFile);
124
125                fileRoot_ = file.parent_path();         
126                files_.push_back(file.filename());
127
128                UpdateFileList();
129                SetDlgItemText(HAL_NEWT_FILE_NAME_EDIT, file.filename().c_str());
130        }
131
132}
133
134wpath DetailsSheet::OutputFile()
135{
136        DoDataExchange(true);
137        return outFile_;
138}
139
140void FilesSheet::OnDirBrowse(UINT, int, HWND hWnd)
141{       
142        WTL::CFolderDialog fldDlg(NULL, L"", BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
143
144        try
145        {
146
147        if (IDOK == fldDlg.DoModal())
148        {
149                files_.clear();
150
151                fileRoot_ = wpath(fldDlg.m_szFolderPath);
152                recurseDirectory(files_, wpath(fldDlg.m_szFolderPath), L"");
153
154                UpdateFileList();               
155                SetDlgItemText(HAL_NEWT_FILE_NAME_EDIT, fileRoot_.filename().c_str());
156        }
157
158        }
159        catch(const std::exception& e)
160        {
161                hal::event_log.post(shared_ptr<hal::EventDetail>(
162                        new hal::EventStdException(hal::event_logger::fatal, e, L"DetailsSheet::OnDirBrowse")));
163        }
164}
165
166void FilesSheet::UpdateFileList()
167{
168        filesList_.DeleteAllItems();
169
170        foreach(wpath& file, files_)
171        {
172                int itemPos = filesList_.AddItem(0, 0, file.filename().c_str(), 0);
173
174                filesList_.SetItemText(itemPos, 1, file.parent_path().file_string().c_str());
175                filesList_.SetItemText(itemPos, 2, lexical_cast<wstring>(
176                        hal::fs::file_size(fileRoot_/file)).c_str());
177        }
178}
179
180wpath FilesSheet::FileFullPath() const
181{
182        return fileRoot_;
183}
184
185hal::file_size_pairs_t FilesSheet::FileSizePairs() const
186{
187        hal::file_size_pairs_t filePairs;
188
189        try
190        {
191
192        for (int i=0, e=filesList_.GetItemCount(); i<e; ++i)
193        {
194                hal::win_c_str<std::wstring> name_buf(MAX_PATH);               
195                filesList_.GetItemText(i, 0, name_buf, name_buf.size());
196
197                hal::win_c_str<std::wstring> path_buf(MAX_PATH);               
198                filesList_.GetItemText(i, 1, path_buf, path_buf.size());
199
200                filePairs.push_back(hal::make_pair(
201                        wpath(wpath(path_buf.str()) / name_buf).string(), 
202                        hal::fs::file_size(fileRoot_ / path_buf / name_buf)));
203        }
204
205        }
206        catch(const std::exception& e)
207        {
208                hal::event_log.post(boost::shared_ptr<hal::EventDetail>(
209                        new hal::EventStdException(hal::event_logger::critical, e, 
210                                L"DetailsSheet::FileSizePairs")));
211        }
212
213        return filePairs;
214}
215
216hal::tracker_details_t TrackerSheet::Trackers() const
217{
218        hal::tracker_details_t trackers;
219
220        if (trackerList_)
221        {
222                for (int i=0, e=trackerList_.GetItemCount(); i<e; ++i)
223                {
224                        hal::win_c_str<std::wstring> str_buf(MAX_PATH);         
225                        trackerList_.GetItemText(i, 0, str_buf, str_buf.size());
226
227                        hal::win_c_str<std::wstring> tier_buf(MAX_PATH);               
228                        trackerList_.GetItemText(i, 1, tier_buf, tier_buf.size());
229
230                        trackers.push_back(hal::tracker_detail(
231                                str_buf, lexical_cast<unsigned>(tier_buf.str())));
232                }
233        }
234
235        return trackers;
236}
237
238hal::dht_node_details_t PeersSheet::DhtNodes() const
239{
240        hal::dht_node_details_t dht_nodes;
241
242        if (peersList_)
243        {
244                hal::win_c_str<std::wstring> str_url(MAX_PATH);
245                hal::win_c_str<std::wstring> str_port(MAX_PATH);
246                hal::win_c_str<std::wstring> str_type(MAX_PATH);
247
248                for (int i=0, e=peersList_.GetItemCount(); i<e; ++i)
249                {
250                        peersList_.GetItemText(i, 0, str_url, str_url.size()); 
251                        peersList_.GetItemText(i, 1, str_port, str_port.size());
252                        peersList_.GetItemText(i, 2, str_type, str_type.size());
253
254                        if (hal::app().res_wstr(HAL_NEWT_ADD_PEERS_DHT) == str_type.str())
255                                dht_nodes.push_back(hal::dht_node_detail(str_url.str(), lexical_cast<unsigned>(str_port.str())));
256                }
257        }
258
259        return dht_nodes;
260}
261
262hal::web_seed_details_t PeersSheet::WebSeeds() const
263{
264        hal::web_seed_details_t web_seeds;
265
266        if (peersList_)
267        {
268                hal::win_c_str<std::wstring> str_url(MAX_PATH);
269                hal::win_c_str<std::wstring> str_type(MAX_PATH);
270
271                for (int i=0, e=peersList_.GetItemCount(); i<e; ++i)
272                {
273                        peersList_.GetItemText(i, 0, str_url, str_url.size()); 
274                        peersList_.GetItemText(i, 2, str_type, str_type.size());
275
276                        if (hal::app().res_wstr(HAL_NEWT_ADD_PEERS_WEB) == str_type.str())
277                                web_seeds.push_back(hal::web_seed_detail(str_url.str()));
278                }
279        }
280
281        return web_seeds;
282}
283
284#define NEWTORRENT_SELECT_LAYOUT \
285        WMB_HEAD(WMB_COLNOMIN(_exp|150), WMB_COL(_auto), WMB_COL(_auto)), \
286                WMB_ROW(_auto,  HAL_NEWTORRENT_SELECT_TEXT, HAL_NEWT_FILE_BROWSE, HAL_NEWT_DIR_BROWSE), \
287                WMB_ROWNOMAX(_exp|50,   HAL_NEWT_LISTFILES,  _r, _r), \
288        WMB_END()
289
290#define NEWTORRENT_BUTTONS_LAYOUT \
291        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
292                WMB_ROW(_auto,  HAL_NEWTORRENT_PRIVATE,  IDOK, IDCANCEL), \
293        WMB_END()
294
295#define NEWTORRENT_COMMENT_LAYOUT \
296        WMB_HEAD(WMB_COLNOMIN(_exp)), \
297                WMB_ROW(_auto,  HAL_NEWTORRENT_COMMENT_TEXT), \
298                WMB_ROW(_exp,   HAL_NEWTORRENT_COMMENT), \
299        WMB_END()
300
301#define NEWTORRENT_CREATOR_LAYOUT \
302        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp)), \
303                WMB_ROW(_auto,  HAL_NEWTORRENT_CREATOR_TEXT,  HAL_NEWTORRENT_CREATOR), \
304        WMB_END()
305
306#define NEWTORRENT_PIECESIZE_LAYOUT \
307        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp)), \
308        WMB_ROW(_auto,  HAL_NEWT_PIECESIZE_TEXT,  HAL_NEWT_PIECESIZE), \
309        WMB_END()
310
311#define NEWTORRENT_OUTPUT_LAYOUT \
312        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp), WMB_COL(_auto)), \
313                WMB_ROW(_auto,  HAL_NEWT_OUTFILE_TEXT,  HAL_NEWT_FILE, HAL_NEWT_OUT_BROWSE), \
314        WMB_END()
315
316DetailsSheet::CWindowMapStruct* DetailsSheet::GetWindowMap()
317{
318        BEGIN_WINDOW_MAP_INLINE(DetailsSheet, 3, 3, 3, 3)
319                WMB_HEAD(WMB_COL(_exp)), 
320                WMB_ROW(_auto, NEWTORRENT_CREATOR_LAYOUT),
321                WMB_ROW(_exp, NEWTORRENT_COMMENT_LAYOUT),
322                WMB_ROW(_auto, NEWTORRENT_PIECESIZE_LAYOUT),
323                WMB_ROW(_auto, NEWTORRENT_OUTPUT_LAYOUT),
324                WMB_ROW(_auto, HAL_NEWTORRENT_PRIVATE),
325                WMB_END() 
326        END_WINDOW_MAP_INLINE() 
327}       
328
329#define NEWTORRENT_FILENAME_LAYOUT \
330        WMB_HEAD(WMB_COL(_exp)), \
331                WMB_ROW(_auto,  HAL_NEWT_FILE_NAME), \
332                WMB_ROW(_auto,  HAL_NEWT_FILE_NAME_EDIT), \
333        WMB_END()
334
335FilesSheet::CWindowMapStruct* FilesSheet::GetWindowMap()
336{
337        BEGIN_WINDOW_MAP_INLINE(FilesSheet, 3, 3, 3, 3)
338                WMB_HEAD(WMB_COL(_exp)), 
339                WMB_ROWNOMIN(_exp, NEWTORRENT_SELECT_LAYOUT),
340                WMB_ROW(_auto, NEWTORRENT_FILENAME_LAYOUT, _r, _r, _r),
341                WMB_END() 
342        END_WINDOW_MAP_INLINE() 
343}       
344
345#define NEWTORRENT_TRACKERS_LAYOUT \
346        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
347                WMB_ROW(_auto,  HAL_NEWTORRENT_TRACKERS_TEXT, _r, _r), \
348                WMB_ROWNOMAX(_exp|50,   HAL_NEWT_LISTTRACKERS,  _r, _r), \
349        WMB_END()
350
351TrackerSheet::CWindowMapStruct* TrackerSheet::GetWindowMap()
352{
353        BEGIN_WINDOW_MAP_INLINE(TrackerSheet, 3, 3, 3, 3)
354                WMB_HEAD(WMB_COL(_exp)), 
355                WMB_ROWNOMIN(_exp, NEWTORRENT_TRACKERS_LAYOUT),
356                WMB_END() 
357        END_WINDOW_MAP_INLINE() 
358}       
359
360#define NEWTORRENT_PEERS_LAYOUT \
361        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
362                WMB_ROW(_auto,  HAL_NEWTORRENT_PEERS_TEXT, _r, _r), \
363                WMB_ROWNOMAX(_exp|50,   HAL_NEWT_LISTPEERS,  _r, _r), \
364        WMB_END()
365
366PeersSheet::CWindowMapStruct* PeersSheet::GetWindowMap()
367{
368        BEGIN_WINDOW_MAP_INLINE(PeersSheet, 3, 3, 3, 3)
369                WMB_HEAD(WMB_COL(_exp)), 
370                WMB_ROWNOMIN(_exp, NEWTORRENT_PEERS_LAYOUT),
371                WMB_END() 
372        END_WINDOW_MAP_INLINE() 
373}       
374
375void NewTorrentDialog::OnShowWindow(BOOL bShow, UINT nStatus)
376{
377    resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
378
379        hal::event_log.post(shared_ptr<hal::EventDetail>(
380                new hal::EventMsg(L"NewTorrentDialog::OnShowWindow()")));
381
382    if (bShow && !inited_)
383    {
384                WTL::CMenuHandle pSysMenu = GetSystemMenu(FALSE);
385
386        if (pSysMenu != NULL)
387            pSysMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, SC_SIZE, L"&Size");
388
389        ModifyStyle(0, WS_THICKFRAME, 0);
390
391                if (rect_.left == rect_.right)
392                {
393                        CenterWindow();
394                }
395                else
396                {
397                        MoveWindow(rect_.left, rect_.top, 
398                                rect_.right-rect_.left, rect_.bottom-rect_.top, true); 
399                }
400
401                ::SetWindowText(GetDlgItem(0x1), hal::app().res_wstr(HAL_SAVE_TEXT).c_str());
402                ::EnableWindow(GetDlgItem(0x1), false);
403
404                inited_ = true;
405                resizeActiveSheet();
406    }
407        else
408        {
409                SetMsgHandled(false);
410        }
411}
412
413LRESULT NewTorrentDialog::OnSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
414{
415        try
416        {
417
418        hal::event_log.post(shared_ptr<hal::EventDetail>(
419                new hal::EventMsg(L"NewTorrentDialog::OnSave()")));
420
421        hal::create_torrent_params params;
422
423        params.creator = fileSheet_.Creator();
424        params.comment = fileSheet_.Comment();
425        params.piece_size = fileSheet_.PieceSize()*1024;
426        params.private_torrent = fileSheet_.Private();
427
428        params.trackers = trackerSheet_.Trackers();
429
430        params.file_size_pairs = filesSheet_.FileSizePairs();
431        params.root_path = filesSheet_.FileFullPath();
432
433        params.dht_nodes = detailsSheet_.DhtNodes();
434        params.web_seeds = detailsSheet_.WebSeeds();
435
436        ProgressDialog progDlg(hal::app().res_wstr(HAL_NEWT_SAVING_TORRENT), bind(
437                &hal::bit::create_torrent, &hal::bittorrent(), params, fileSheet_.OutputFile(), _1));
438
439        int err_code = progDlg.DoModal();
440
441        HAL_DEV_MSG(hal::wform(L"progDlg err_code: %1%") % err_code);
442
443        if (err_code == 0) SendMessage(WM_CLOSE);
444
445        }
446        catch(const std::exception& e)
447        {
448                hal::event_log.post(boost::shared_ptr<hal::EventDetail>(
449                        new hal::EventStdException(hal::event_logger::critical, e, 
450                                L"NewTorrentDialog::OnSave")));
451        }
452
453        return 0;
454}
Note: See TracBrowser for help on using the repository browser.