source: src/HaliteDialog.cpp @ 252

Revision 252, 10.8 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        if (canUpdate())
164        {
165                UpdateLock<listClass> rLock(*this);
166//              hal::mutex_t::scoped_lock l(mutex_);
167               
168                peerDetails_ = tD.selectedTorrent()->peerDetails();
169                //clearAll();
170       
171                std::sort(peerDetails_.begin(), peerDetails_.end());
172               
173                // Wipe details not present
174                for(int i = 0; i < GetItemCount(); /*nothing here*/)
175                {
176                        boost::array<wchar_t, MAX_PATH> ip_address;
177                        GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
178                       
179                        hal::PeerDetail ip(ip_address.data());
180                        hal::PeerDetails::iterator iter = 
181                                std::lower_bound(peerDetails_.begin(), peerDetails_.end(), ip);
182                       
183                        if (iter == peerDetails_.end() || !((*iter) == ip))
184                        {
185                                DeleteItem(i);
186                        }
187                        else
188                        {
189                                SetItemData(i, std::distance(peerDetails_.begin(), iter));
190                       
191                                DWORD index = GetItemData(i);           
192                                hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, (wformat(L"peerDetails set A %1%, %2% - %3%") % i % std::distance(peerDetails_.begin(), iter) % index).str().c_str())));
193
194                                ++i;
195                        }
196                }
197               
198                // Add additional details
199                for (hal::PeerDetails::iterator i=peerDetails_.begin(), e=peerDetails_.end();
200                        i != e; ++i)
201                {                       
202                        LV_FINDINFO findInfo; 
203                        findInfo.flags = LVFI_STRING;
204                        findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
205                       
206                        int itemPos = FindItem(&findInfo, -1);
207                        if (itemPos < 0)
208                                itemPos = AddItem(GetItemCount(), 0, (*i).ipAddress.c_str(), 0);
209       
210                        SetItemData(itemPos, std::distance(peerDetails_.begin(), i));
211                       
212                        DWORD index = GetItemData(itemPos);                     
213                        hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, (wformat(L"peerDetails set B %1%, %2% - %3%") % itemPos % std::distance(peerDetails_.begin(), i) % index).str().c_str())));
214                       
215                        SetItemText(itemPos, 1, (*i).country.c_str());
216                       
217                        SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str());
218                       
219                        SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str());
220                       
221                        if ((*i).seed)
222                                SetItemText(itemPos, 4, L"Seed");
223                       
224                        SetItemText(itemPos, 5, (*i).client.c_str());
225                }                       
226        }
227}
228
229void HaliteDialog::uiUpdate(const hal::TorrentDetails& tD) 
230{       
231        if (tD.selectedTorrent())       
232        {
233                SetDlgItemText(IDC_NAME, tD.selectedTorrent()->filename().c_str());
234                SetDlgItemText(IDC_TRACKER, tD.selectedTorrent()->currentTracker().c_str());
235                SetDlgItemText(IDC_STATUS, tD.selectedTorrent()->state().c_str());
236                m_prog.SetPos(static_cast<int>(tD.selectedTorrent()->completion()*100));
237               
238                if (!tD.selectedTorrent()->estimatedTimeLeft().is_special())
239                {
240                        SetDlgItemText(IDC_AVAIL,
241                                (hal::from_utf8(boost::posix_time::to_simple_string(
242                                        tD.selectedTorrent()->estimatedTimeLeft())).c_str()));
243                }
244                else
245                {
246                        SetDlgItemText(IDC_AVAIL,L"∞");         
247                }
248               
249                SetDlgItemText(IDC_COMPLETE,
250                        (wformat(L"%1$.2fmb of %2$.2fmb") 
251                                % (static_cast<float>(tD.selectedTorrent()->totalWantedDone())/(1024*1024))
252                                % (static_cast<float>(tD.selectedTorrent()->totalWanted())/(1024*1024))
253                        ).str().c_str());
254               
255                m_list.uiUpdate(tD);
256        }
257        else
258        {
259               
260/*              SetDlgItemText(IDC_NAME, L"N/A");
261                SetDlgItemText(IDC_TRACKER, L"N/A");
262                SetDlgItemText(IDC_STATUS, L"N/A");
263                SetDlgItemText(IDC_AVAIL, L"N/A");
264                SetDlgItemText(IDC_COMPLETE, L"N/A");
265               
266                SetDlgItemText(BTNPAUSE, L"Pause");
267               
268                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
269                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
270                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
271               
272                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
273                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
274                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
275                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
276               
277                m_list.DeleteAllItems();
278*/
279        }
280}
281
282void HaliteDialog::updateDialog()
283{
284#       if 0
285
286        hal::TorrentDetail_ptr pTD = hal::bittorrent().getTorrentDetail_vec(
287                selection_manager().selected());
288       
289        if (pTD)       
290        {
291                SetDlgItemText(IDC_NAME, pTD->filename().c_str());
292                SetDlgItemText(IDC_TRACKER, pTD->currentTracker().c_str());
293                SetDlgItemText(IDC_STATUS, pTD->state().c_str());
294                m_prog.SetPos(static_cast<int>(pTD->completion()*100));
295               
296                if (!pTD->estimatedTimeLeft().is_special())
297                {
298                        SetDlgItemText(IDC_AVAIL,
299                                (hal::from_utf8(boost::posix_time::to_simple_string(pTD->estimatedTimeLeft())).c_str()));
300                }
301                else
302                {
303                        SetDlgItemText(IDC_AVAIL,L"∞");         
304                }
305               
306                SetDlgItemText(IDC_COMPLETE,
307                        (wformat(L"%1$.2fmb of %2$.2fmb") 
308                                % (static_cast<float>(pTD->totalWantedDone())/(1024*1024))
309                                % (static_cast<float>(pTD->totalWanted())/(1024*1024))
310                        ).str().c_str());
311               
312                hal::PeerDetails peerDetails;
313                hal::bittorrent().getAllPeerDetails(selection_manager().selected(), peerDetails);
314               
315                if (!peerDetails.empty())
316                {
317                        // Here we remove any peers no longer connected.
318                       
319                        std::sort(peerDetails.begin(), peerDetails.end());
320                       
321                        for(int i = 0; i < m_list.GetItemCount(); /*nothing here*/)
322                        {
323                                boost::array<wchar_t, MAX_PATH> ip_address;
324                                m_list.GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
325                               
326                                hal::PeerDetail ip(ip_address.data());
327                                hal::PeerDetails::iterator iter = 
328                                        std::lower_bound(peerDetails.begin(), peerDetails.end(), ip);
329                               
330                                if (iter == peerDetails.end() || !((*iter) == ip))
331                                        m_list.DeleteItem(i);
332                                else
333                                        ++i;
334                        }
335                       
336                        // And now here we add/update the connected peers
337                       
338                        for (hal::PeerDetails::iterator i = peerDetails.begin(); 
339                                i != peerDetails.end(); ++i)
340                        {                       
341                                LV_FINDINFO findInfo; 
342                                findInfo.flags = LVFI_STRING;
343                                findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
344                               
345                                int itemPos = m_list.FindItem(&findInfo, -1);
346                                if (itemPos < 0)
347                                        itemPos = m_list.AddItem(0, 0, (*i).ipAddress.c_str(), 0);
348                               
349                                m_list.SetItemText(itemPos, 1,
350                                        (wformat(L"%1$.2fKB/s") 
351                                                % ((*i).speed.first/1024)
352                                        ).str().c_str());       
353                               
354                                m_list.SetItemText(itemPos, 2,
355                                        (wformat(L"%1$.2fKB/s") 
356                                                % ((*i).speed.second/1024)
357                                        ).str().c_str());       
358                               
359                                if ((*i).seed)
360                                        m_list.SetItemText(itemPos, 3, L"Seed");
361                               
362                                m_list.SetItemText(itemPos, 4, (*i).client.c_str());
363                        }                       
364                }
365        }
366        else
367        {
368               
369/*              SetDlgItemText(IDC_NAME, L"N/A");
370                SetDlgItemText(IDC_TRACKER, L"N/A");
371                SetDlgItemText(IDC_STATUS, L"N/A");
372                SetDlgItemText(IDC_AVAIL, L"N/A");
373                SetDlgItemText(IDC_COMPLETE, L"N/A");
374               
375                SetDlgItemText(BTNPAUSE, L"Pause");
376               
377                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
378                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
379                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
380               
381                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
382                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
383                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
384                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
385               
386                m_list.DeleteAllItems();
387*/
388        }
389#       endif
390}
Note: See TracBrowser for help on using the repository browser.