source: trunk/src/NewTorrentDialog.cpp @ 472

Revision 472, 11.2 KB checked in by Eoin, 12 years ago (diff)

Deleting useless branches.

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