source: trunk/src/NewTorrentDialog.cpp @ 461

Revision 461, 11.1 KB checked in by Eoin, 12 years ago (diff)

Improved Torrent Creation.

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