source: trunk/src/NewTorrentDialog.cpp @ 431

Revision 431, 8.8 KB checked in by Eoin, 12 years ago (diff)

Torrent creation soooooo close.

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