~ubuntu-branches/debian/experimental/libtorrent/experimental

« back to all changes in this revision

Viewing changes to src/data/entry_list.h

  • Committer: Bazaar Package Importer
  • Author(s): Jose Luis Rivas
  • Date: 2007-03-31 10:31:05 UTC
  • mto: (4.1.4 gutsy) (6.2.1 squeeze) (1.3.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 6.
  • Revision ID: james.westby@ubuntu.com-20070331103105-jzpp1rml6ud0ff75
Tags: upstream-0.11.4
ImportĀ upstreamĀ versionĀ 0.11.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// libTorrent - BitTorrent library
2
 
// Copyright (C) 2005-2006, Jari Sundell
3
 
//
4
 
// This program is free software; you can redistribute it and/or modify
5
 
// it under the terms of the GNU General Public License as published by
6
 
// the Free Software Foundation; either version 2 of the License, or
7
 
// (at your option) any later version.
8
 
// 
9
 
// This program is distributed in the hope that it will be useful,
10
 
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
// GNU General Public License for more details.
13
 
// 
14
 
// You should have received a copy of the GNU General Public License
15
 
// along with this program; if not, write to the Free Software
16
 
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
//
18
 
// In addition, as a special exception, the copyright holders give
19
 
// permission to link the code of portions of this program with the
20
 
// OpenSSL library under certain conditions as described in each
21
 
// individual source file, and distribute linked combinations
22
 
// including the two.
23
 
//
24
 
// You must obey the GNU General Public License in all respects for
25
 
// all of the code used other than OpenSSL.  If you modify file(s)
26
 
// with this exception, you may extend this exception to your version
27
 
// of the file(s), but you are not obligated to do so.  If you do not
28
 
// wish to do so, delete this exception statement from your version.
29
 
// If you delete this exception statement from all source files in the
30
 
// program, then also delete it here.
31
 
//
32
 
// Contact:  Jari Sundell <jaris@ifi.uio.no>
33
 
//
34
 
//           Skomakerveien 33
35
 
//           3185 Skoppum, NORWAY
36
 
 
37
 
#ifndef LIBTORRENT_ENTRY_LIST_H
38
 
#define LIBTORRENT_ENTRY_LIST_H
39
 
 
40
 
#include <vector>
41
 
#include <rak/functional.h>
42
 
 
43
 
#include "entry_list_node.h"
44
 
 
45
 
namespace torrent {
46
 
 
47
 
class Chunk;
48
 
class EntryListNode;
49
 
class FileManager;
50
 
class MemoryChunk;
51
 
 
52
 
class EntryList : private std::vector<EntryListNode*> {
53
 
public:
54
 
  typedef std::vector<EntryListNode*>                 base_type;
55
 
  typedef std::vector<std::string>                    path_list;
56
 
  typedef rak::mem_fun1<FileManager, void, FileMeta*> slot_meta_type;
57
 
 
58
 
  using base_type::value_type;
59
 
 
60
 
  using base_type::iterator;
61
 
  using base_type::reverse_iterator;
62
 
 
63
 
  using base_type::begin;
64
 
  using base_type::end;
65
 
  using base_type::rbegin;
66
 
  using base_type::rend;
67
 
 
68
 
  using base_type::back;
69
 
  using base_type::empty;
70
 
  using base_type::reserve;
71
 
 
72
 
  EntryList() : m_bytesSize(0), m_isOpen(false) {}
73
 
  ~EntryList() { clear(); }
74
 
 
75
 
  bool                is_open() const                            { return m_isOpen; }
76
 
 
77
 
  // We take over ownership of 'file'.
78
 
  void                push_back(const Path& path, const EntryListNode::Range& range, off_t size);
79
 
 
80
 
  void                clear();
81
 
 
82
 
  // Only closes the files.
83
 
  void                open();
84
 
  void                close();
85
 
 
86
 
  // You must call set_root_dir after all nodes have been added.
87
 
  const std::string&  root_dir() const                           { return m_rootDir; }
88
 
  void                set_root_dir(const std::string& path);
89
 
 
90
 
  bool                resize_all();
91
 
 
92
 
  size_t              files_size() const                         { return base_type::size(); }
93
 
  off_t               bytes_size() const                         { return m_bytesSize; }
94
 
 
95
 
  // If the files span multiple disks, the one with the least amount
96
 
  // of free diskspace will be returned.
97
 
  uint64_t            free_diskspace() const;
98
 
 
99
 
  EntryListNode*      get_node(uint32_t idx)                     { return base_type::operator[](idx); }
100
 
 
101
 
  Chunk*              create_chunk(off_t offset, uint32_t length, int prot);
102
 
 
103
 
  iterator            at_position(iterator itr, off_t offset);
104
 
 
105
 
  path_list*          indirect_links()                           { return &m_indirectLinks; }
106
 
 
107
 
  void                slot_insert_filemeta(slot_meta_type s)     { m_slotInsertFileMeta = s; }
108
 
  void                slot_erase_filemeta(slot_meta_type s)      { m_slotEraseFileMeta = s; }
109
 
 
110
 
private:
111
 
  bool                open_file(EntryListNode* node, const Path& lastPath);
112
 
 
113
 
  inline void         make_directory(Path::const_iterator pathBegin, Path::const_iterator pathEnd, Path::const_iterator startItr);
114
 
 
115
 
  inline MemoryChunk  create_chunk_part(iterator itr, off_t offset, uint32_t length, int prot);
116
 
 
117
 
  off_t               m_bytesSize;
118
 
  std::string         m_rootDir;
119
 
 
120
 
  bool                m_isOpen;
121
 
 
122
 
  path_list           m_indirectLinks;
123
 
 
124
 
  slot_meta_type      m_slotInsertFileMeta;
125
 
  slot_meta_type      m_slotEraseFileMeta;
126
 
};
127
 
 
128
 
}
129
 
 
130
 
#endif