Changeset 341


Ignore:
Timestamp:
11/30/07 19:51:39 (12 years ago)
Author:
Eoin
Message:

Big improvements to fast resume file management.

Files:
7 edited

Legend:

Unmodified
Added
Removed
  • Halite.pnproj

    r340 r341  
    1 <Project name="Halite"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="res" path="res\"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="res24" path="res24\"><File path="ad.ico"></File><File path="ae.ico"></File><File path="af.ico"></File><File path="ag.ico"></File><File path="ai.ico"></File><File path="al.ico"></File><File path="am.ico"></File><File path="an.ico"></File><File path="ao.ico"></File><File path="ar.ico"></File><File path="as.ico"></File><File path="at.ico"></File><File path="au.ico"></File><File path="aw.ico"></File><File path="ax.ico"></File><File path="az.ico"></File><File path="ba.ico"></File><File path="bb.ico"></File><File path="bd.ico"></File><File path="be.ico"></File><File path="bf.ico"></File><File path="bg.ico"></File><File path="bh.ico"></File><File path="bi.ico"></File><File path="bj.ico"></File><File path="bm.ico"></File><File path="bn.ico"></File><File path="bo.ico"></File><File path="br.ico"></File><File path="bs.ico"></File><File path="bt.ico"></File><File path="bw.ico"></File><File path="by.ico"></File><File path="bz.ico"></File><File path="ca.ico"></File><File path="cc.ico"></File><File path="cd.ico"></File><File path="cf.ico"></File><File path="cg.ico"></File><File path="ch.ico"></File><File path="ci.ico"></File><File path="ck.ico"></File><File path="cl.ico"></File><File path="cm.ico"></File><File path="cn.ico"></File><File path="co.ico"></File><File path="cr.ico"></File><File path="cu.ico"></File><File path="cv.ico"></File><File path="cx.ico"></File><File path="cy.ico"></File><File path="cz.ico"></File><File path="de.ico"></File><File path="dj.ico"></File><File path="dk.ico"></File><File path="dm.ico"></File><File path="do.ico"></File><File path="dz.ico"></File><File path="ec.ico"></File><File path="ee.ico"></File><File path="eg.ico"></File><File path="eh.ico"></File><File path="er.ico"></File><File path="es.ico"></File><File path="et.ico"></File><File path="fi.ico"></File><File path="fj.ico"></File><File path="fk.ico"></File><File path="fm.ico"></File><File path="fo.ico"></File><File path="fr.ico"></File><File path="ga.ico"></File><File path="gb.ico"></File><File path="gd.ico"></File><File path="ge.ico"></File><File path="gg.ico"></File><File path="gh.ico"></File><File path="gi.ico"></File><File path="gk.ico"></File><File path="gl.ico"></File><File path="gm.ico"></File><File path="gn.ico"></File><File path="gp.ico"></File><File path="gq.ico"></File><File path="gr.ico"></File><File path="gs.ico"></File><File path="gt.ico"></File><File path="gu.ico"></File><File path="gw.ico"></File><File path="gy.ico"></File><File path="hk.ico"></File><File path="hn.ico"></File><File path="hr.ico"></File><File path="ht.ico"></File><File path="hu.ico"></File><File path="Icons.h"></File><File path="Icons.rc"></File><File path="id.ico"></File><File path="ie.ico"></File><File path="il.ico"></File><File path="im.ico"></File><File path="in.ico"></File><File path="io.ico"></File><File path="iq.ico"></File><File path="ir.ico"></File><File path="is.ico"></File><File path="it.ico"></File><File path="je.ico"></File><File path="jm.ico"></File><File path="jo.ico"></File><File path="jp.ico"></File><File path="ke.ico"></File><File path="kg.ico"></File><File path="kh.ico"></File><File path="ki.ico"></File><File path="km.ico"></File><File path="kn.ico"></File><File path="kp.ico"></File><File path="kr.ico"></File><File path="kw.ico"></File><File path="ky.ico"></File><File path="kz.ico"></File><File path="la.ico"></File><File path="lb.ico"></File><File path="lc.ico"></File><File path="li.ico"></File><File path="lk.ico"></File><File path="lr.ico"></File><File path="ls.ico"></File><File path="lt.ico"></File><File path="lu.ico"></File><File path="lv.ico"></File><File path="ly.ico"></File><File path="ma.ico"></File><File path="mc.ico"></File><File path="md.ico"></File><File path="me.ico"></File><File path="mg.ico"></File><File path="mh.ico"></File><File path="mk.ico"></File><File path="ml.ico"></File><File path="mm.ico"></File><File path="mn.ico"></File><File path="mo.ico"></File><File path="mp.ico"></File><File path="mq.ico"></File><File path="mr.ico"></File><File path="ms.ico"></File><File path="mt.ico"></File><File path="mu.ico"></File><File path="mv.ico"></File><File path="mw.ico"></File><File path="mx.ico"></File><File path="my.ico"></File><File path="mz.ico"></File><File path="na.ico"></File><File path="nc.ico"></File><File path="ne.ico"></File><File path="nf.ico"></File><File path="ng.ico"></File><File path="ni.ico"></File><File path="nl.ico"></File><File path="no.ico"></File><File path="not.ico"></File><File path="np.ico"></File><File path="nr.ico"></File><File path="nu.ico"></File><File path="nz.ico"></File><File path="om.ico"></File><File path="pa.ico"></File><File path="pe.ico"></File><File path="pf.ico"></File><File path="pg.ico"></File><File path="ph.ico"></File><File path="pk.ico"></File><File path="pl.ico"></File><File path="pm.ico"></File><File path="pn.ico"></File><File path="pr.ico"></File><File path="ps.ico"></File><File path="pt.ico"></File><File path="pw.ico"></File><File path="py.ico"></File><File path="qa.ico"></File><File path="ro.ico"></File><File path="rs.ico"></File><File path="ru.ico"></File><File path="rw.ico"></File><File path="sa.ico"></File><File path="sb.ico"></File><File path="sc.ico"></File><File path="sd.ico"></File><File path="se.ico"></File><File path="sg.ico"></File><File path="sh.ico"></File><File path="si.ico"></File><File path="sk.ico"></File><File path="sl.ico"></File><File path="sm.ico"></File><File path="sn.ico"></File><File path="so.ico"></File><File path="sr.ico"></File><File path="st.ico"></File><File path="sv.ico"></File><File path="sy.ico"></File><File path="sz.ico"></File><File path="tc.ico"></File><File path="td.ico"></File><File path="Template.rc"></File><File path="tf.ico"></File><File path="tg.ico"></File><File path="th.ico"></File><File path="tj.ico"></File><File path="tk.ico"></File><File path="tl.ico"></File><File path="tm.ico"></File><File path="tn.ico"></File><File path="to.ico"></File><File path="tr.ico"></File><File path="tt.ico"></File><File path="tv.ico"></File><File path="tw.ico"></File><File path="tz.ico"></File><File path="ua.ico"></File><File path="ug.ico"></File><File path="us.ico"></File><File path="uy.ico"></File><File path="uz.ico"></File><File path="va.ico"></File><File path="vc.ico"></File><File path="ve.ico"></File><File path="vg.ico"></File><File path="vi.ico"></File><File path="vn.ico"></File><File path="vu.ico"></File><File path="wf.ico"></File><File path="ws.ico"></File><File path="ye.ico"></File><File path="yu.ico"></File><File path="za.ico"></File><File path="zm.ico"></File><File path="zw.ico"></File></MagicFolder><File path="afxres.h"></File><File path="English.rtf"></File><File path="Halite.aps"></File><File path="Halite.ico"></File><File path="Halite.rc"></File><File path="Icons.rc"></File><File path="Manifest.xml"></File><File path="resource.h"></File><File path="Slovenian.rc.bak"></File><File path="toolbar.bmp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="src" path="src\"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="advtabs" path="advtabs\"><File path="Debug.cpp"></File><File path="Debug.hpp"></File><File path="Files.cpp"></File><File path="Files.hpp"></File><File path="Peers.cpp"></File><File path="Peers.hpp"></File><File path="ThemeTestDialog.hpp"></File><File path="Torrent.cpp"></File><File path="Torrent.hpp"></File><File path="Tracker.cpp"></File><File path="Tracker.hpp"></File><File path="TrackerAddDialog.hpp"></File><File path="TrackerListView.cpp"></File><File path="TrackerListView.hpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="global" path="global\"><File path="InheritEnum.hpp"></File><File path="ini.cpp"></File><File path="ini.hpp"></File><File path="ini_adapter.cpp"></File><File path="ini_adapter.hpp"></File><File path="logger.cpp"></File><File path="logger.hpp"></File><File path="string_conv.cpp"></File><File path="string_conv.hpp"></File><File path="tinyxml.cpp"></File><File path="tinyxml.hpp"></File><File path="TinyXml.rb"></File><File path="tinyxmlerror.cpp"></File><File path="tinyxmlparser.cpp"></File><File path="unicode.hpp"></File><File path="utf8.hpp"></File><File path="wtl_app.cpp"></File><File path="wtl_app.hpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="test" path="test\"><File path="client_test.cpp"></File></MagicFolder><File path="AddTorrentDialog.hpp"></File><File path="AdvHaliteDialog.cpp"></File><File path="AdvHaliteDialog.hpp"></File><File path="AtlAutosizeDlg.h"></File><File path="ConfigOptions.cpp"></File><File path="ConfigOptions.hpp"></File><File path="CSSFileDialog.hpp"></File><File path="DdxEx.hpp"></File><File path="DebugDialog.hpp"></File><File path="DropFileTarget.h"></File><File path="halConfig.cpp"></File><File path="halConfig.hpp"></File><File path="halEvent.cpp"></File><File path="halEvent.hpp"></File><File path="Halite.cpp"></File><File path="Halite.hpp"></File><File path="HaliteDialog.cpp"></File><File path="HaliteDialog.hpp"></File><File path="HaliteDialogBase.hpp"></File><File path="HaliteEditCtrl.hpp"></File><File path="HaliteIni.hpp"></File><File path="HaliteListManager.hpp"></File><File path="HaliteListView.cpp"></File><File path="HaliteListView.hpp"></File><File path="HaliteListViewCtrl.hpp"></File><File path="HaliteMini.cpp"></File><File path="HaliteMini.hpp"></File><File path="HaliteSortListViewCtrl.hpp"></File><File path="HaliteTabCtrl.hpp"></File><File path="HaliteTabPage.hpp"></File><File path="HaliteUpdateLock.hpp"></File><File path="HaliteWindow.cpp"></File><File path="HaliteWindow.hpp"></File><File path="HaliteWindowMini.cpp"></File><File path="HaliteWindowMini.hpp"></File><File path="halTorrent.cpp"></File><File path="halTorrent.hpp"></File><File path="halTorrentInternal.hpp"></File><File path="halXmlRpc.cpp"></File><File path="halXmlRpc.hpp"></File><File path="NTray.cpp"></File><File path="NTray.hpp"></File><File path="ProgressDialog.hpp"></File><File path="SimpleHtml.h"></File><File path="SplashDialog.hpp"></File><File path="SSFileDialog.hpp"></File><File path="stdAfx.cpp"></File><File path="stdAfx.hpp"></File><File path="UxthemeWrapper.cpp"></File><File path="UxthemeWrapper.hpp"></File><File path="WinAPIMutex.hpp"></File><File path="WinAPIWaitableTimer.hpp"></File></MagicFolder><File path="Jamfile.v2"></File></Project> 
     1<Project name="Halite"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="res" path="res\"><File path="afxres.h"></File><File path="English.rtf"></File><File path="Halite.aps"></File><File path="Halite.ico"></File><File path="Halite.rc"></File><File path="Manifest.xml"></File><File path="resource.h"></File><File path="toolbar.bmp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="src" path="src\"><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="advtabs" path="advtabs\"><File path="Debug.cpp"></File><File path="Debug.hpp"></File><File path="Files.cpp"></File><File path="Files.hpp"></File><File path="Peers.cpp"></File><File path="Peers.hpp"></File><File path="ThemeTestDialog.hpp"></File><File path="Torrent.cpp"></File><File path="Torrent.hpp"></File><File path="Tracker.cpp"></File><File path="Tracker.hpp"></File><File path="TrackerAddDialog.hpp"></File><File path="TrackerListView.cpp"></File><File path="TrackerListView.hpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="global" path="global\"><File path="InheritEnum.hpp"></File><File path="ini.cpp"></File><File path="ini.hpp"></File><File path="ini_adapter.cpp"></File><File path="ini_adapter.hpp"></File><File path="logger.cpp"></File><File path="logger.hpp"></File><File path="string_conv.cpp"></File><File path="string_conv.hpp"></File><File path="tinyxml.cpp"></File><File path="tinyxml.hpp"></File><File path="TinyXml.rb"></File><File path="tinyxmlerror.cpp"></File><File path="tinyxmlparser.cpp"></File><File path="unicode.hpp"></File><File path="utf8.hpp"></File><File path="wtl_app.cpp"></File><File path="wtl_app.hpp"></File></MagicFolder><MagicFolder excludeFolders="CVS;.svn" filter="*.*" name="test" path="test\"><File path="client_test.cpp"></File></MagicFolder><File path="AddTorrentDialog.hpp"></File><File path="AdvHaliteDialog.cpp"></File><File path="AdvHaliteDialog.hpp"></File><File path="AtlAutosizeDlg.h"></File><File path="ConfigOptions.cpp"></File><File path="ConfigOptions.hpp"></File><File path="CSSFileDialog.hpp"></File><File path="DdxEx.hpp"></File><File path="DebugDialog.hpp"></File><File path="DropFileTarget.h"></File><File path="halConfig.cpp"></File><File path="halConfig.hpp"></File><File path="halEvent.cpp"></File><File path="halEvent.hpp"></File><File path="Halite.cpp"></File><File path="Halite.hpp"></File><File path="HaliteDialog.cpp"></File><File path="HaliteDialog.hpp"></File><File path="HaliteDialogBase.hpp"></File><File path="HaliteEditCtrl.hpp"></File><File path="HaliteIni.hpp"></File><File path="HaliteListManager.hpp"></File><File path="HaliteListView.cpp"></File><File path="HaliteListView.hpp"></File><File path="HaliteListViewCtrl.hpp"></File><File path="HaliteMini.cpp"></File><File path="HaliteMini.hpp"></File><File path="HaliteSortListViewCtrl.hpp"></File><File path="HaliteTabCtrl.hpp"></File><File path="HaliteTabPage.hpp"></File><File path="HaliteUpdateLock.hpp"></File><File path="HaliteWindow.cpp"></File><File path="HaliteWindow.hpp"></File><File path="HaliteWindowMini.cpp"></File><File path="HaliteWindowMini.hpp"></File><File path="halTorrent.cpp"></File><File path="halTorrent.hpp"></File><File path="halTorrentInternal.hpp"></File><File path="halXmlRpc.cpp"></File><File path="halXmlRpc.hpp"></File><File path="NTray.cpp"></File><File path="NTray.hpp"></File><File path="ProgressDialog.hpp"></File><File path="SimpleHtml.h"></File><File path="SplashDialog.hpp"></File><File path="SSFileDialog.hpp"></File><File path="stdAfx.cpp"></File><File path="stdAfx.hpp"></File><File path="UxthemeWrapper.cpp"></File><File path="UxthemeWrapper.hpp"></File><File path="WinAPIMutex.hpp"></File><File path="WinAPIWaitableTimer.hpp"></File></MagicFolder><File path="Jamfile.v2"></File></Project> 
  • Halite.pnps

    r339 r341  
    1 <pd><ViewState><e p="Halite\src\advtabs" x="true"></e><e p="Halite" x="true"></e><e p="Halite\res" x="true"></e><e p="Halite\res\res24" x="false"></e><e p="Halite\src" x="true"></e><e p="Halite\src\global" x="true"></e><e p="Halite\src\test" x="false"></e></ViewState></pd> 
     1<pd><ViewState><e p="Halite\src\advtabs" x="true"></e><e p="Halite" x="true"></e><e p="Halite\res" x="true"></e><e p="Halite\src" x="true"></e><e p="Halite\src\global" x="true"></e><e p="Halite\src\test" x="false"></e></ViewState></pd> 
  • Jamfile.v2

    r340 r341  
    3636        ; 
    3737         
    38 if false 
    39 { 
    40         SOURCES += HaliteMini.cpp ; 
    41         SOURCES += HaliteWindowMini.cpp ; 
    42 #       SOURCES += Halite.cpp ; 
    43 #       SOURCES += HaliteWindow.cpp ; 
    44 } 
    45 else 
    46 { 
    47         SOURCES += HaliteMini.cpp ; 
    48         SOURCES += HaliteWindowMini.cpp ; 
    49 } 
     38        SOURCES += Halite.cpp ; 
     39        SOURCES += HaliteWindow.cpp ; 
    5040         
    5141RESOURCES = 
  • res/Halite.rc

    r333 r341  
    462462    IDS_SAVEPROMPT                "Select a directory to save the files to or cancel to not download torrent at all." 
    463463    IDS_NA                        "N/A" 
    464     HAL_INF                       "" 
     464    HAL_INF                       "" 
    465465    HAL_COMPLETED_SUMMARY         "%1$.2fMB of %2$.2fMB" 
    466466    HAL_DOWNLOAD_SUMMARY          "This Session Downloaded %1$.2fMB, Uploaded %2$.2fMB, Ratio %3$.2f." 
     
    494494STRINGTABLE  
    495495BEGIN 
    496     HAL_PEER_INTERESTING    "Interesting" 
    497     HAL_PEER_CHOKED         "Choked" 
    498     HAL_PEER_REMOTE_INTERESTING "Interested in us" 
    499     HAL_PEER_REMOTE_CHOKED  "Has choked us" 
    500     HAL_PEER_SUPPORT_EXTENSIONS "Supports extensions" 
    501     HAL_PEER_LOCAL_CONNECTION "Local connection" 
    502     HAL_PEER_HANDSHAKE      "Handshake" 
    503     HAL_PEER_CONNECTING     "Connecting" 
    504     HAL_PEER_QUEUED         "Queued" 
    505     HAL_PEER_RC4_ENCRYPTED     "RC4 Encrypted" 
    506     HAL_PEER_PLAINTEXT_ENCRYPTED         "Plaintext Encrypted" 
     496    HAL_PEER_INTERESTING                "Interesting" 
     497    HAL_PEER_CHOKED                     "Choked" 
     498    HAL_PEER_REMOTE_INTERESTING         "Interested in us" 
     499    HAL_PEER_REMOTE_CHOKED              "Has choked us" 
     500    HAL_PEER_SUPPORT_EXTENSIONS         "Supports extensions" 
     501    HAL_PEER_LOCAL_CONNECTION           "Local connection" 
     502    HAL_PEER_HANDSHAKE                  "Handshake" 
     503    HAL_PEER_CONNECTING                 "Connecting" 
     504    HAL_PEER_QUEUED                             "Queued" 
     505    HAL_PEER_RC4_ENCRYPTED              "RC4 Encrypted" 
     506    HAL_PEER_PLAINTEXT_ENCRYPTED    "Plaintext Encrypted" 
    507507END 
    508508 
  • res/resource.h

    r326 r341  
    207207#define HAL_EVENT_PEER                  40034 
    208208#define HAL_EVENT_TRACKER               40035 
    209 #define HAL_TORRENT_PAUSED              40059 
    210209#define HAL_TORRENT_METADATA            40060 
    211210#define HAL_DIALOGPEER_LISTVIEW_ADV             40070 
  • src/halTorrent.cpp

    r340 r341  
    169169{ 
    170170        libtorrent::session* TorrentInternal::the_session_ = 0; 
     171        wpath TorrentInternal::workingDir_; 
    171172} 
    172173 
     
    354355                                        Event::info, a.timestamp()))); 
    355356 
    356                         get(a.handle).completedPause(); 
     357                        get(a.handle).completedPauseEvent(); 
    357358                } 
    358359                 
     
    603604                timer_(io_), 
    604605                keepChecking_(false), 
    605                 workingDirectory(hal::app().working_directory()), 
    606606                bittorrentIni(L"BitTorrent.xml"), 
    607607                theTorrents(bittorrentIni), 
     
    617617        { 
    618618                TorrentInternal::the_session_ = &theSession; 
    619                  
     619                TorrentInternal::workingDir_ = workingDir(); 
     620                                 
    620621                theSession.set_severity_level(lbt::alert::debug);                
    621622                theSession.add_extension(&lbt::create_metadata_plugin); 
     
    690691        bool keepChecking_; 
    691692         
    692         const wpath workingDirectory; 
     693        static wpath workingDirectory; 
    693694        ini_file bittorrentIni; 
    694695        TorrentManager theTorrents;      
     
    715716         
    716717}; 
     718 
     719 
     720wpath BitTorrent_impl::workingDirectory = hal::app().working_directory(); 
    717721 
    718722BitTorrent::BitTorrent() : 
     
    13281332                        { 
    13291333                                 
    1330                         (*i).torrent.prepare(file, (*i).torrent.saveDirectory(), pimpl->workingDirectory);       
     1334                        (*i).torrent.prepare(file, (*i).torrent.saveDirectory());        
    13311335 
    13321336                        switch ((*i).torrent.state()) 
     
    13741378        try { 
    13751379         
    1376         wpath resumeDir=pimpl->workingDirectory/L"resume"; 
    1377          
    1378         if (!exists(resumeDir)) 
    1379                 create_directory(resumeDir); 
    1380  
    13811380        event().post(shared_ptr<EventDetail>( 
    1382                 new EventInfo(L"Stopping all torrents."))); 
     1381                new EventInfo(L"Stopping all torrents..."))); 
    13831382         
    13841383        for (TorrentManager::torrentByName::iterator i=pimpl->theTorrents.begin(), e=pimpl->theTorrents.end();  
     
    13921391         
    13931392        // Ok this polling loop here is a bit curde, but a blocking wait is actually appropiate. 
    1394         for (bool allPaused = true; !allPaused; ) 
     1393        for (bool nonePaused = true; !nonePaused; ) 
    13951394        { 
    13961395                for (TorrentManager::torrentByName::iterator i=pimpl->theTorrents.begin(), e=pimpl->theTorrents.end();  
    13971396                                i != e; ++i) 
    1398                         allPaused &= (TorrentDetail::torrent_paused == (*i).torrent.state()); 
     1397                { 
     1398                        // NB. this checks for an internal paused state. 
     1399                        nonePaused &= ((*i).torrent.inSession() ? (*i).torrent.handle().is_paused() : true); 
     1400                } 
    13991401                 
    14001402                Sleep(200); 
     
    14021404         
    14031405        event().post(shared_ptr<EventDetail>( 
    1404                 new EventInfo(L"Torrents stopped."))); 
     1406                new EventInfo(L"All torrents stopped."))); 
    14051407                 
    14061408        for (TorrentManager::torrentByName::iterator i=pimpl->theTorrents.begin(), e=pimpl->theTorrents.end();  
     
    14091411                if ((*i).torrent.inSession()) 
    14101412                { 
    1411                         lbt::entry resumedata = (*i).torrent.handle().write_resume_data(); 
    1412                         pimpl->theSession.remove_torrent((*i).torrent.handle()); 
    1413                          
    1414                         bool halencode_result = halencode(resumeDir/(*i).torrent.filename(), resumedata); 
    1415                         assert(halencode_result); 
     1413                        (*i).torrent.removeFromSession(); 
     1414                        (*i).torrent.writeResumeData(); 
    14161415                } 
    14171416        } 
    14181417         
    14191418        event().post(shared_ptr<EventDetail>( 
    1420                 new EventInfo(L"Resume data written."))); 
     1419                new EventInfo(L"Fast-resume data written."))); 
    14211420         
    14221421        } HAL_GENERIC_TORRENT_EXCEPTION_CATCH("Torrent Unknown!", "closeAll") 
  • src/halTorrentInternal.hpp

    r331 r341  
    77#pragma once 
    88 
    9 #define HAL_PEER_INTERESTING                                    40037 
    10 #define HAL_PEER_CHOKED                                     40038 
    11 #define HAL_PEER_REMOTE_INTERESTING                                     40039 
    12 #define HAL_PEER_REMOTE_CHOKED                                          40040 
    13 #define HAL_PEER_SUPPORT_EXTENSIONS                                     40041 
    14 #define HAL_PEER_LOCAL_CONNECTION                                       40042 
    15 #define HAL_PEER_HANDSHAKE                                                      40043 
    16 #define HAL_PEER_CONNECTING                                                     40044 
    17 #define HAL_PEER_QUEUED                                                         40045 
    18 #define HAL_PEER_RC4_ENCRYPTED                                          40046 
    19 #define HAL_PEER_PLAINTEXT_ENCRYPTED                            40047 
    20 #define HAL_TORRENT_QUEUED_CHECKING                                     40050 
    21 #define HAL_TORRENT_CHECKING_FILES                                      40051 
    22 #define HAL_TORRENT_CONNECTING                                          40052 
    23 #define HAL_TORRENT_DOWNLOADING                                         40053 
    24 #define HAL_TORRENT_FINISHED                                            40054 
    25 #define HAL_TORRENT_SEEDING                                                     40055 
    26 #define HAL_TORRENT_ALLOCATING                                          40056 
    27 #define HAL_TORRENT_QUEUED                                                      40057 
    28 #define HAL_TORRENT_STOPPED                                                     40058 
    29 #define HAL_TORRENT_PAUSED                                                      40059 
    30 #define HAL_TORRENT_STOPPING                                            50000 
    31 #define HAL_TORRENT_PAUSING                                                     50001 
     9#define HAL_TORRENT_INT_BEGIN                           40500 
     10#define HAL_PEER_INTERESTING                    HAL_TORRENT_INT_BEGIN + 1 
     11#define HAL_PEER_CHOKED                         HAL_TORRENT_INT_BEGIN + 2 
     12#define HAL_PEER_REMOTE_INTERESTING                     HAL_TORRENT_INT_BEGIN + 3 
     13#define HAL_PEER_REMOTE_CHOKED                          HAL_TORRENT_INT_BEGIN + 4 
     14#define HAL_PEER_SUPPORT_EXTENSIONS                     HAL_TORRENT_INT_BEGIN + 5 
     15#define HAL_PEER_LOCAL_CONNECTION                       HAL_TORRENT_INT_BEGIN + 6 
     16#define HAL_PEER_HANDSHAKE                                      HAL_TORRENT_INT_BEGIN + 7 
     17#define HAL_PEER_CONNECTING                                     HAL_TORRENT_INT_BEGIN + 8 
     18#define HAL_PEER_QUEUED                                         HAL_TORRENT_INT_BEGIN + 9 
     19#define HAL_PEER_RC4_ENCRYPTED                          HAL_TORRENT_INT_BEGIN + 10 
     20#define HAL_PEER_PLAINTEXT_ENCRYPTED            HAL_TORRENT_INT_BEGIN + 11 
     21#define HAL_TORRENT_QUEUED_CHECKING                     HAL_TORRENT_INT_BEGIN + 12 
     22#define HAL_TORRENT_CHECKING_FILES                      HAL_TORRENT_INT_BEGIN + 13 
     23#define HAL_TORRENT_CONNECTING                          HAL_TORRENT_INT_BEGIN + 14 
     24#define HAL_TORRENT_DOWNLOADING                         HAL_TORRENT_INT_BEGIN + 15 
     25#define HAL_TORRENT_FINISHED                            HAL_TORRENT_INT_BEGIN + 16 
     26#define HAL_TORRENT_SEEDING                                     HAL_TORRENT_INT_BEGIN + 17 
     27#define HAL_TORRENT_ALLOCATING                          HAL_TORRENT_INT_BEGIN + 18 
     28#define HAL_TORRENT_QUEUED                                      HAL_TORRENT_INT_BEGIN + 19 
     29#define HAL_TORRENT_STOPPED                                     HAL_TORRENT_INT_BEGIN + 20 
     30#define HAL_TORRENT_PAUSED                                      HAL_TORRENT_INT_BEGIN + 21 
     31#define HAL_TORRENT_STOPPING                            HAL_TORRENT_INT_BEGIN + 22 
     32#define HAL_TORRENT_PAUSING                                     HAL_TORRENT_INT_BEGIN + 23 
    3233 
    3334#ifndef RC_INVOKED 
     
    232233                assert(the_session_); 
    233234                 
    234                 prepare(filename, save_directory_, workingDirectory); 
     235                prepare(filename, save_directory_); 
    235236        } 
    236237         
     
    269270                                storage = lbt::storage_mode_compact; 
    270271                         
    271                         handle_ = the_session_->add_torrent(metadata_, dir, resumedata_, storage, paused); 
     272                        handle_ = the_session_->add_torrent(metadata_, dir, resumedata_, storage, paused);                       
     273                        assert(handle_.is_valid()); 
     274                         
     275                        clearResumeData(); 
    272276                         
    273277                        in_session_ = true; 
    274278                        if (paused) 
    275279                                state_ = TorrentDetail::torrent_paused;  
    276                          
     280                                 
    277281                        applySettings(); 
    278282                }        
     283        } 
     284         
     285        void removeFromSession() 
     286        { 
     287                assert(inSession()); 
     288                 
     289                resumedata_ = handle_.write_resume_data(); // Update the fast-resume data 
     290                writeResumeData(); 
     291                 
     292                the_session_->remove_torrent(handle_); 
     293                in_session_ = false;             
     294                 
     295                assert(!inSession());    
    279296        } 
    280297         
     
    329346                if (state_ != TorrentDetail::torrent_stopped) 
    330347                { 
    331                         the_session_->remove_torrent(handle_); 
    332                         in_session_ = false; 
    333                 } 
    334                  
    335                 state_ = TorrentDetail::torrent_stopped; 
    336                 assert(!inSession());                    
    337         } 
    338          
    339         void completedPause() 
    340         { 
    341                 if (TorrentDetail::torrent_pausing == state_ && inSession()) 
    342                 { 
    343                         state_ = TorrentDetail::torrent_paused;  
    344                         assert(handle_.is_paused()); 
    345                 } 
     348                        if (state_ == TorrentDetail::torrent_active) 
     349                        { 
     350                                assert(inSession()); 
     351                                handle_.pause(); 
     352                                state_ = TorrentDetail::torrent_stopping; 
     353                        } 
     354                        else if (state_ == TorrentDetail::torrent_paused) 
     355                        {                        
     356                                removeFromSession(); 
     357 
     358                                state_ = TorrentDetail::torrent_stopped;                                 
     359                        } 
     360                } 
     361        } 
     362         
     363        void writeResumeData() 
     364        {                                
     365                wpath resumeDir = workingDir_/L"resume"; 
     366                 
     367                if (!exists(resumeDir)) 
     368                        create_directory(resumeDir); 
     369                                 
     370                bool halencode_result = halencode(resumeDir/filename_, resumedata_); 
     371                assert(halencode_result); 
     372        } 
     373         
     374        void clearResumeData() 
     375        { 
     376                wpath resumeFile = workingDir_/L"resume"/filename_; 
     377                 
     378                if (exists(resumeFile)) 
     379                        remove(resumeFile); 
    346380        } 
    347381         
     
    612646        } 
    613647         
    614         void prepare(wpath filename, wpath saveDirectory, wpath workingDirectory) 
     648        void prepare(wpath filename, wpath saveDirectory) 
    615649        { 
    616650                if (exists(filename))  
     
    619653                extractNames(metadata_);                         
    620654                 
    621                 const wpath resumeFile = workingDirectory/L"resume"/filename_; 
    622                 const wpath torrentFile = workingDirectory/L"torrents"/filename_; 
     655                const wpath resumeFile = workingDir_/L"resume"/filename_; 
     656                const wpath torrentFile = workingDir_/L"torrents"/filename_; 
    623657                 
    624658                event().post(shared_ptr<EventDetail>(new EventMsg( 
     
    628662                        resumedata_ = haldecode(resumeFile); 
    629663 
    630                 if (!exists(workingDirectory/L"torrents")) 
    631                         create_directory(workingDirectory/L"torrents"); 
     664                if (!exists(workingDir_/L"torrents")) 
     665                        create_directory(workingDir_/L"torrents"); 
    632666 
    633667                if (!exists(torrentFile)) 
     
    746780        } 
    747781         
     782        void completedPauseEvent() 
     783        { 
     784                event().post(shared_ptr<EventDetail>( 
     785                        new EventInfo(L"completedPauseEvent"))); 
     786                 
     787                assert(inSession());             
     788                 
     789                if (TorrentDetail::torrent_pausing == state_) 
     790                { 
     791                        state_ = TorrentDetail::torrent_paused;  
     792                        assert(handle_.is_paused()); 
     793                } 
     794                else if (TorrentDetail::torrent_stopping == state_) 
     795                { 
     796                        removeFromSession(); 
     797                         
     798                        state_ = TorrentDetail::torrent_stopped; 
     799                } 
     800        } 
     801         
    748802        static libtorrent::session* the_session_; 
     803        static wpath workingDir_; 
    749804         
    750805        std::pair<float, float> transferLimit_; 
Note: See TracChangeset for help on using the changeset viewer.