source: trunk/src/NewTorrentDialog.cpp @ 552

Revision 552, 11.6 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        wpath currentDir(baseDir / relDir);
101
102        if (hal::fs::is_directory(currentDir))
103    {
104                for (hal::fs::wdirectory_iterator i(currentDir), end; i != end; ++i)
105                        recurseDirectory(files, baseDir, relDir / i->filename());
106    }
107    else
108    {
109                files.push_back(baseDir.filename()/relDir);             
110    }
111}
112
113void FilesSheet::OnFileBrowse(UINT, int, HWND hWnd)
114{       
115        CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"All Files (*.*)|*.*|", m_hWnd);
116
117        if (dlgOpen.DoModal() == IDOK) 
118        {
119                files_.clear();
120                wpath file = wpath(dlgOpen.m_ofn.lpstrFile);
121
122                fileRoot_ = file.parent_path();         
123                files_.push_back(file.filename());
124
125                UpdateFileList();
126                SetDlgItemText(HAL_NEWT_FILE_NAME_EDIT, file.filename().c_str());
127        }
128
129}
130
131wpath DetailsSheet::OutputFile()
132{
133        DoDataExchange(true);
134        return outFile_;
135}
136
137void FilesSheet::OnDirBrowse(UINT, int, HWND hWnd)
138{       
139        WTL::CFolderDialog fldDlg(NULL, L"",    BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
140
141        try
142        {
143
144        if (IDOK == fldDlg.DoModal())
145        {
146                files_.clear();
147
148                fileRoot_ = wpath(fldDlg.m_szFolderPath).parent_path();
149                recurseDirectory(files_, wpath(fldDlg.m_szFolderPath), L"");
150
151                UpdateFileList();               
152                SetDlgItemText(HAL_NEWT_FILE_NAME_EDIT, fileRoot_.filename().c_str());
153        }
154
155        }
156        catch(const std::exception& e)
157        {
158                hal::event_log.post(shared_ptr<hal::EventDetail>(
159                        new hal::EventStdException(hal::event_logger::fatal, e, L"DetailsSheet::OnDirBrowse")));
160        }
161}
162
163void FilesSheet::UpdateFileList()
164{
165        filesList_.DeleteAllItems();
166
167        foreach(wpath& file, files_)
168        {
169                int itemPos = filesList_.AddItem(0, 0, file.filename().c_str(), 0);
170
171                filesList_.SetItemText(itemPos, 1, file.parent_path().file_string().c_str());
172                filesList_.SetItemText(itemPos, 2, lexical_cast<wstring>(
173                        hal::fs::file_size(fileRoot_/file)).c_str());
174        }
175}
176
177wpath FilesSheet::FileFullPath() const
178{
179        return fileRoot_;
180}
181
182hal::file_size_pairs_t FilesSheet::FileSizePairs() const
183{
184        hal::file_size_pairs_t filePairs;
185
186        try
187        {
188
189        for (int i=0, e=filesList_.GetItemCount(); i<e; ++i)
190        {
191                hal::win_c_str<std::wstring> name_buf(MAX_PATH);               
192                filesList_.GetItemText(i, 0, name_buf, name_buf.size());
193
194                hal::win_c_str<std::wstring> path_buf(MAX_PATH);               
195                filesList_.GetItemText(i, 1, path_buf, path_buf.size());
196
197                filePairs.push_back(hal::make_pair(
198                        wpath(wpath(path_buf.str()) / name_buf).string(), 
199                        hal::fs::file_size(fileRoot_ / path_buf / name_buf)));
200        }
201
202        }
203        catch(const std::exception& e)
204        {
205                hal::event_log.post(boost::shared_ptr<hal::EventDetail>(
206                        new hal::EventStdException(hal::event_logger::critical, e, 
207                                L"DetailsSheet::FileSizePairs")));
208        }
209
210        return filePairs;
211}
212
213hal::tracker_details_t TrackerSheet::Trackers() const
214{
215        hal::tracker_details_t trackers;
216
217        if (trackerList_)
218        {
219                for (int i=0, e=trackerList_.GetItemCount(); i<e; ++i)
220                {
221                        hal::win_c_str<std::wstring> str_buf(MAX_PATH);         
222                        trackerList_.GetItemText(i, 0, str_buf, str_buf.size());
223
224                        hal::win_c_str<std::wstring> tier_buf(MAX_PATH);               
225                        trackerList_.GetItemText(i, 1, tier_buf, tier_buf.size());
226
227                        trackers.push_back(hal::tracker_detail(
228                                str_buf, lexical_cast<unsigned>(tier_buf.str())));
229                }
230        }
231
232        return trackers;
233}
234
235hal::dht_node_details_t PeersSheet::DhtNodes() const
236{
237        hal::dht_node_details_t dht_nodes;
238
239        if (peersList_)
240        {
241                hal::win_c_str<std::wstring> str_url(MAX_PATH);
242                hal::win_c_str<std::wstring> str_port(MAX_PATH);
243                hal::win_c_str<std::wstring> str_type(MAX_PATH);
244
245                for (int i=0, e=peersList_.GetItemCount(); i<e; ++i)
246                {
247                        peersList_.GetItemText(i, 0, str_url, str_url.size()); 
248                        peersList_.GetItemText(i, 1, str_port, str_port.size());
249                        peersList_.GetItemText(i, 2, str_type, str_type.size());
250
251                        if (hal::app().res_wstr(HAL_NEWT_ADD_PEERS_DHT) == str_type.str())
252                                dht_nodes.push_back(hal::dht_node_detail(str_url.str(), lexical_cast<unsigned>(str_port.str())));
253                }
254        }
255
256        return dht_nodes;
257}
258
259hal::web_seed_details_t PeersSheet::WebSeeds() const
260{
261        hal::web_seed_details_t web_seeds;
262
263        if (peersList_)
264        {
265                hal::win_c_str<std::wstring> str_url(MAX_PATH);
266                hal::win_c_str<std::wstring> str_type(MAX_PATH);
267
268                for (int i=0, e=peersList_.GetItemCount(); i<e; ++i)
269                {
270                        peersList_.GetItemText(i, 0, str_url, str_url.size()); 
271                        peersList_.GetItemText(i, 2, str_type, str_type.size());
272
273                        if (hal::app().res_wstr(HAL_NEWT_ADD_PEERS_WEB) == str_type.str())
274                                web_seeds.push_back(hal::web_seed_detail(str_url.str()));
275                }
276        }
277
278        return web_seeds;
279}
280
281#define NEWTORRENT_SELECT_LAYOUT \
282        WMB_HEAD(WMB_COLNOMIN(_exp|150), WMB_COL(_auto), WMB_COL(_auto)), \
283                WMB_ROW(_auto,  HAL_NEWTORRENT_SELECT_TEXT, HAL_NEWT_FILE_BROWSE, HAL_NEWT_DIR_BROWSE), \
284                WMB_ROWNOMAX(_exp|50,   HAL_NEWT_LISTFILES,  _r, _r), \
285        WMB_END()
286
287#define NEWTORRENT_BUTTONS_LAYOUT \
288        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
289                WMB_ROW(_auto,  HAL_NEWTORRENT_PRIVATE,  IDOK, IDCANCEL), \
290        WMB_END()
291
292#define NEWTORRENT_COMMENT_LAYOUT \
293        WMB_HEAD(WMB_COLNOMIN(_exp)), \
294                WMB_ROW(_auto,  HAL_NEWTORRENT_COMMENT_TEXT), \
295                WMB_ROW(_exp,   HAL_NEWTORRENT_COMMENT), \
296        WMB_END()
297
298#define NEWTORRENT_CREATOR_LAYOUT \
299        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp)), \
300                WMB_ROW(_auto,  HAL_NEWTORRENT_CREATOR_TEXT,  HAL_NEWTORRENT_CREATOR), \
301        WMB_END()
302
303#define NEWTORRENT_PIECESIZE_LAYOUT \
304        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp)), \
305        WMB_ROW(_auto,  HAL_NEWT_PIECESIZE_TEXT,  HAL_NEWT_PIECESIZE), \
306        WMB_END()
307
308#define NEWTORRENT_OUTPUT_LAYOUT \
309        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp), WMB_COL(_auto)), \
310                WMB_ROW(_auto,  HAL_NEWT_OUTFILE_TEXT,  HAL_NEWT_FILE, HAL_NEWT_OUT_BROWSE), \
311        WMB_END()
312
313DetailsSheet::CWindowMapStruct* DetailsSheet::GetWindowMap()
314{
315        BEGIN_WINDOW_MAP_INLINE(DetailsSheet, 3, 3, 3, 3)
316                WMB_HEAD(WMB_COL(_exp)), 
317                WMB_ROW(_auto, NEWTORRENT_CREATOR_LAYOUT),
318                WMB_ROW(_exp, NEWTORRENT_COMMENT_LAYOUT),
319                WMB_ROW(_auto, NEWTORRENT_PIECESIZE_LAYOUT),
320                WMB_ROW(_auto, NEWTORRENT_OUTPUT_LAYOUT),
321                WMB_ROW(_auto, HAL_NEWTORRENT_PRIVATE),
322                WMB_END() 
323        END_WINDOW_MAP_INLINE() 
324}       
325
326#define NEWTORRENT_FILENAME_LAYOUT \
327        WMB_HEAD(WMB_COL(_exp)), \
328                WMB_ROW(_auto,  HAL_NEWT_FILE_NAME), \
329                WMB_ROW(_auto,  HAL_NEWT_FILE_NAME_EDIT), \
330        WMB_END()
331
332FilesSheet::CWindowMapStruct* FilesSheet::GetWindowMap()
333{
334        BEGIN_WINDOW_MAP_INLINE(FilesSheet, 3, 3, 3, 3)
335                WMB_HEAD(WMB_COL(_exp)), 
336                WMB_ROWNOMIN(_exp, NEWTORRENT_SELECT_LAYOUT),
337                WMB_ROW(_auto, NEWTORRENT_FILENAME_LAYOUT, _r, _r, _r),
338                WMB_END() 
339        END_WINDOW_MAP_INLINE() 
340}       
341
342#define NEWTORRENT_TRACKERS_LAYOUT \
343        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
344                WMB_ROW(_auto,  HAL_NEWTORRENT_TRACKERS_TEXT, _r, _r), \
345                WMB_ROWNOMAX(_exp|50,   HAL_NEWT_LISTTRACKERS,  _r, _r), \
346        WMB_END()
347
348TrackerSheet::CWindowMapStruct* TrackerSheet::GetWindowMap()
349{
350        BEGIN_WINDOW_MAP_INLINE(TrackerSheet, 3, 3, 3, 3)
351                WMB_HEAD(WMB_COL(_exp)), 
352                WMB_ROWNOMIN(_exp, NEWTORRENT_TRACKERS_LAYOUT),
353                WMB_END() 
354        END_WINDOW_MAP_INLINE() 
355}       
356
357#define NEWTORRENT_PEERS_LAYOUT \
358        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
359                WMB_ROW(_auto,  HAL_NEWTORRENT_PEERS_TEXT, _r, _r), \
360                WMB_ROWNOMAX(_exp|50,   HAL_NEWT_LISTPEERS,  _r, _r), \
361        WMB_END()
362
363PeersSheet::CWindowMapStruct* PeersSheet::GetWindowMap()
364{
365        BEGIN_WINDOW_MAP_INLINE(PeersSheet, 3, 3, 3, 3)
366                WMB_HEAD(WMB_COL(_exp)), 
367                WMB_ROWNOMIN(_exp, NEWTORRENT_PEERS_LAYOUT),
368                WMB_END() 
369        END_WINDOW_MAP_INLINE() 
370}       
371
372void NewTorrentDialog::OnShowWindow(BOOL bShow, UINT nStatus)
373{
374    resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
375
376        hal::event_log.post(shared_ptr<hal::EventDetail>(
377                new hal::EventMsg(L"NewTorrentDialog::OnShowWindow()")));
378
379    if (bShow && !inited_)
380    {
381                WTL::CMenuHandle pSysMenu = GetSystemMenu(FALSE);
382
383        if (pSysMenu != NULL)
384            pSysMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, SC_SIZE, L"&Size");
385
386        ModifyStyle(0, WS_THICKFRAME, 0);
387
388                if (rect_.left == rect_.right)
389                {
390                        CenterWindow();
391                }
392                else
393                {
394                        MoveWindow(rect_.left, rect_.top, 
395                                rect_.right-rect_.left, rect_.bottom-rect_.top, true); 
396                }
397
398                ::SetWindowText(GetDlgItem(0x1), hal::app().res_wstr(HAL_SAVE_TEXT).c_str());
399                ::EnableWindow(GetDlgItem(0x1), false);
400
401                inited_ = true;
402                resizeActiveSheet();
403    }
404        else
405        {
406                SetMsgHandled(false);
407        }
408}
409
410LRESULT NewTorrentDialog::OnSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
411{
412        try
413        {
414
415        hal::event_log.post(shared_ptr<hal::EventDetail>(
416                new hal::EventMsg(L"NewTorrentDialog::OnSave()")));
417
418        hal::create_torrent_params params;
419
420        params.creator = fileSheet_.Creator();
421        params.comment = fileSheet_.Comment();
422        params.piece_size = fileSheet_.PieceSize()*1024;
423        params.private_torrent = fileSheet_.Private();
424
425        params.trackers = trackerSheet_.Trackers();
426
427        params.file_size_pairs = filesSheet_.FileSizePairs();
428        params.root_path = filesSheet_.FileFullPath();
429
430        params.dht_nodes = detailsSheet_.DhtNodes();
431        params.web_seeds = detailsSheet_.WebSeeds();
432
433        ProgressDialog progDlg(hal::app().res_wstr(HAL_NEWT_SAVING_TORRENT), bind(
434                &hal::bit::create_torrent, &hal::bittorrent(), params, fileSheet_.OutputFile(), _1));
435
436        int err_code = progDlg.DoModal();
437
438        HAL_DEV_MSG(hal::wform(L"progDlg err_code: %1%") % err_code);
439
440        if (err_code == 0) SendMessage(WM_CLOSE);
441
442        }
443        catch(const std::exception& e)
444        {
445                hal::event_log.post(boost::shared_ptr<hal::EventDetail>(
446                        new hal::EventStdException(hal::event_logger::critical, e, 
447                                L"NewTorrentDialog::OnSave")));
448        }
449
450        return 0;
451}
Note: See TracBrowser for help on using the repository browser.