source: trunk/src/NewTorrentDialog.cpp @ 432

Revision 432, 10.0 KB checked in by Eoin, 13 years ago (diff)

Torrent creation is working!

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