source: src/HaliteDialog.cpp @ 237

Revision 237, 9.6 KB checked in by Eoin, 13 years ago (diff)
Line 
1
2#include <algorithm>
3#include <boost/format.hpp>
4#include <boost/array.hpp>
5
6#include "stdAfx.hpp"
7#include "HaliteDialog.hpp"
8#include "HaliteWindow.hpp"
9#include "HaliteListView.hpp"
10#include "halEvent.hpp"
11
12HaliteDialog::HaliteDialog(HaliteWindow& halWindow, ui_signal& ui_sig, ListViewManager& single_sel) :
13                dialogBaseClass(halWindow, ui_sig, single_sel)
14{
15//      ui_.attach(bind(&HaliteDialog::updateDialog, this));
16//      selection_manager_.attach(bind(&HaliteDialog::selectionChanged, this, _1));
17       
18//      load();
19}
20
21void HaliteDialog::selectionChanged(const string& torrent_name)
22{       
23#       if 0   
24        pair<float, float> tranLimit(-1.0, -1.0);
25        pair<int, int> connLimit(-1, -1);
26       
27        if (hal::bittorrent().isTorrent(torrent_name))
28        {
29                tranLimit = hal::bittorrent().getTorrentSpeed(torrent_name);
30                connLimit = hal::bittorrent().getTorrentLimit(torrent_name);
31               
32                if (!hal::bittorrent().isTorrentActive(torrent_name))
33                        SetDlgItemText(BTNPAUSE, L"Resume");
34                else           
35                        SetDlgItemText(BTNPAUSE, L"Pause");
36               
37                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
38                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
39                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
40               
41                ::EnableWindow(GetDlgItem(IDC_EDITTLD), true);
42                ::EnableWindow(GetDlgItem(IDC_EDITTLU), true);
43                ::EnableWindow(GetDlgItem(IDC_EDITNCD), true);
44                ::EnableWindow(GetDlgItem(IDC_EDITNCU), true);
45        }
46        else
47        {
48                SetDlgItemText(IDC_NAME, L"N/A");
49                SetDlgItemText(IDC_TRACKER, L"N/A");
50                SetDlgItemText(IDC_STATUS, L"N/A");
51                SetDlgItemText(IDC_AVAIL, L"N/A");
52                SetDlgItemText(IDC_COMPLETE, L"N/A");
53               
54                SetDlgItemText(BTNPAUSE, L"Pause");             
55                m_prog.SetPos(0);
56               
57                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
58                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
59                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
60               
61                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
62                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
63                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
64                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
65        }
66       
67        NoConnDown = connLimit.first;
68        NoConnUp = connLimit.second;
69        TranLimitDown = tranLimit.first;
70        TranLimitUp = tranLimit.second;
71       
72        DoDataExchange(false); 
73        m_list.DeleteAllItems();       
74        ui().update();
75#       endif
76}
77
78LRESULT HaliteDialog::onInitDialog(HWND, LPARAM)
79{
80        dialogBaseClass::InitializeHalDialogBase();
81        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
82       
83{       m_prog.Attach(GetDlgItem(TORRENTPROG));
84        m_prog.SetRange(0, 100);
85}       
86        m_list.Attach(GetDlgItem(LISTPEERS));
87       
88        NoConnDown = -1;
89        NoConnUp = -1;
90        TranLimitDown = -1;
91        TranLimitUp = -1;       
92       
93        DoDataExchange(false);
94        return 0;
95}
96
97void HaliteDialog::saveStatus()
98{
99        m_list.saveSettings();
100}
101
102void HaliteDialog::onClose()
103{
104        saveStatus();
105       
106        if(::IsWindow(m_hWnd)) 
107        {
108                ::DestroyWindow(m_hWnd);
109        }
110}
111
112void HaliteDialog::onPause(UINT, int, HWND)
113{
114        string torrentName = selection_manager().selected();
115        if (!hal::bittorrent().isTorrentActive(torrentName))
116        {
117                SetDlgItemText(BTNPAUSE,L"Pause");
118                hal::bittorrent().resumeTorrent(torrentName);
119        }
120        else
121        {
122                SetDlgItemText(BTNPAUSE,L"Resume");
123                hal::bittorrent().pauseTorrent(torrentName);
124        }
125       
126        ui().update();
127}
128
129void HaliteDialog::onReannounce(UINT, int, HWND)
130{
131//      hal::event().post(boost::shared_ptr<hal::EventDetail>(
132//              new hal::EventXmlException(hal::to_wstr("I'm an exception!"), hal::to_wstr("I'm a name!"))));
133
134        hal::bittorrent().reannounceTorrent(selection_manager().selected());
135}
136
137void HaliteDialog::onRemove(UINT, int, HWND)
138{
139        hal::bittorrent().removeTorrent(selection_manager().selected());
140        selection_manager().clear();           
141       
142        ui().update();
143}
144
145LRESULT HaliteDialog::OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl)
146{
147        DoDataExchange(true);
148       
149        hal::bittorrent().setTorrentSpeed(selection_manager().selected(), TranLimitDown, TranLimitUp);
150        hal::bittorrent().setTorrentLimit(selection_manager().selected(), NoConnDown, NoConnUp);
151       
152        return 0;
153}
154
155LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
156{       
157        ::SetTextColor(hDC, RGB(255, 0, 255)); 
158       
159        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
160}
161
162void HaliteDialog::uiUpdate(const hal::TorrentDetails& tD) 
163{       
164        if (tD.selectedTorrent())       
165        {
166                SetDlgItemText(IDC_NAME, tD.selectedTorrent()->filename().c_str());
167                SetDlgItemText(IDC_TRACKER, tD.selectedTorrent()->currentTracker().c_str());
168                SetDlgItemText(IDC_STATUS, tD.selectedTorrent()->state().c_str());
169                m_prog.SetPos(static_cast<int>(tD.selectedTorrent()->completion()*100));
170               
171                if (!tD.selectedTorrent()->estimatedTimeLeft().is_special())
172                {
173                        SetDlgItemText(IDC_AVAIL,
174                                (hal::from_utf8(boost::posix_time::to_simple_string(
175                                        tD.selectedTorrent()->estimatedTimeLeft())).c_str()));
176                }
177                else
178                {
179                        SetDlgItemText(IDC_AVAIL,L"∞");         
180                }
181               
182                SetDlgItemText(IDC_COMPLETE,
183                        (wformat(L"%1$.2fmb of %2$.2fmb") 
184                                % (static_cast<float>(tD.selectedTorrent()->totalWantedDone())/(1024*1024))
185                                % (static_cast<float>(tD.selectedTorrent()->totalWanted())/(1024*1024))
186                        ).str().c_str());
187                               
188                m_list.SetRedraw(false);
189                m_list.manager().clearAll();
190               
191                if (!tD.selectedTorrent()->peerDetails().empty())
192                {                       
193                       
194                        foreach (const hal::PeerDetail& peer, tD.selectedTorrent()->peerDetails())
195                        {                       
196                                LV_FINDINFO findInfo; 
197                                findInfo.flags = LVFI_STRING;
198                                findInfo.psz = const_cast<LPTSTR>(peer.ipAddress.c_str());
199                               
200                                int itemPos = m_list.FindItem(&findInfo, -1);
201                                if (itemPos < 0)
202                                        itemPos = m_list.AddItem(0, 0, peer.ipAddress.c_str(), 0);
203                               
204                                m_list.SetItemText(itemPos, 1,
205                                        (wformat(L"%1$.2fKB/s") 
206                                                % (peer.speed.first/1024)
207                                        ).str().c_str());       
208                               
209                                m_list.SetItemText(itemPos, 2,
210                                        (wformat(L"%1$.2fKB/s") 
211                                                % (peer.speed.second/1024)
212                                        ).str().c_str());       
213                               
214                                if (peer.seed)
215                                        m_list.SetItemText(itemPos, 3, L"Seed");
216                               
217                                m_list.SetItemText(itemPos, 4, peer.client.c_str());
218                        }                       
219                }
220               
221                m_list.SetRedraw(true);
222        }
223        else
224        {
225               
226/*              SetDlgItemText(IDC_NAME, L"N/A");
227                SetDlgItemText(IDC_TRACKER, L"N/A");
228                SetDlgItemText(IDC_STATUS, L"N/A");
229                SetDlgItemText(IDC_AVAIL, L"N/A");
230                SetDlgItemText(IDC_COMPLETE, L"N/A");
231               
232                SetDlgItemText(BTNPAUSE, L"Pause");
233               
234                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
235                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
236                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
237               
238                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
239                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
240                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
241                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
242               
243                m_list.DeleteAllItems();
244*/
245        }
246}
247
248void HaliteDialog::updateDialog()
249{
250#       if 0
251
252        hal::TorrentDetail_ptr pTD = hal::bittorrent().getTorrentDetail_vec(
253                selection_manager().selected());
254       
255        if (pTD)       
256        {
257                SetDlgItemText(IDC_NAME, pTD->filename().c_str());
258                SetDlgItemText(IDC_TRACKER, pTD->currentTracker().c_str());
259                SetDlgItemText(IDC_STATUS, pTD->state().c_str());
260                m_prog.SetPos(static_cast<int>(pTD->completion()*100));
261               
262                if (!pTD->estimatedTimeLeft().is_special())
263                {
264                        SetDlgItemText(IDC_AVAIL,
265                                (hal::from_utf8(boost::posix_time::to_simple_string(pTD->estimatedTimeLeft())).c_str()));
266                }
267                else
268                {
269                        SetDlgItemText(IDC_AVAIL,L"∞");         
270                }
271               
272                SetDlgItemText(IDC_COMPLETE,
273                        (wformat(L"%1$.2fmb of %2$.2fmb") 
274                                % (static_cast<float>(pTD->totalWantedDone())/(1024*1024))
275                                % (static_cast<float>(pTD->totalWanted())/(1024*1024))
276                        ).str().c_str());
277               
278                hal::PeerDetails peerDetails;
279                hal::bittorrent().getAllPeerDetails(selection_manager().selected(), peerDetails);
280               
281                if (!peerDetails.empty())
282                {
283                        // Here we remove any peers no longer connected.
284                       
285                        std::sort(peerDetails.begin(), peerDetails.end());
286                       
287                        for(int i = 0; i < m_list.GetItemCount(); /*nothing here*/)
288                        {
289                                boost::array<wchar_t, MAX_PATH> ip_address;
290                                m_list.GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
291                               
292                                hal::PeerDetail ip(ip_address.data());
293                                hal::PeerDetails::iterator iter = 
294                                        std::lower_bound(peerDetails.begin(), peerDetails.end(), ip);
295                               
296                                if (iter == peerDetails.end() || !((*iter) == ip))
297                                        m_list.DeleteItem(i);
298                                else
299                                        ++i;
300                        }
301                       
302                        // And now here we add/update the connected peers
303                       
304                        for (hal::PeerDetails::iterator i = peerDetails.begin(); 
305                                i != peerDetails.end(); ++i)
306                        {                       
307                                LV_FINDINFO findInfo; 
308                                findInfo.flags = LVFI_STRING;
309                                findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
310                               
311                                int itemPos = m_list.FindItem(&findInfo, -1);
312                                if (itemPos < 0)
313                                        itemPos = m_list.AddItem(0, 0, (*i).ipAddress.c_str(), 0);
314                               
315                                m_list.SetItemText(itemPos, 1,
316                                        (wformat(L"%1$.2fKB/s") 
317                                                % ((*i).speed.first/1024)
318                                        ).str().c_str());       
319                               
320                                m_list.SetItemText(itemPos, 2,
321                                        (wformat(L"%1$.2fKB/s") 
322                                                % ((*i).speed.second/1024)
323                                        ).str().c_str());       
324                               
325                                if ((*i).seed)
326                                        m_list.SetItemText(itemPos, 3, L"Seed");
327                               
328                                m_list.SetItemText(itemPos, 4, (*i).client.c_str());
329                        }                       
330                }
331        }
332        else
333        {
334               
335/*              SetDlgItemText(IDC_NAME, L"N/A");
336                SetDlgItemText(IDC_TRACKER, L"N/A");
337                SetDlgItemText(IDC_STATUS, L"N/A");
338                SetDlgItemText(IDC_AVAIL, L"N/A");
339                SetDlgItemText(IDC_COMPLETE, L"N/A");
340               
341                SetDlgItemText(BTNPAUSE, L"Pause");
342               
343                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
344                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
345                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
346               
347                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
348                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
349                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
350                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
351               
352                m_list.DeleteAllItems();
353*/
354        }
355#       endif
356}
Note: See TracBrowser for help on using the repository browser.