source: src/HaliteDialog.cpp @ 253

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