hash.Update((const byte *)data.c_str(), data.length());
}
- /* save data for producing torrent data */
- torrent.save_data(data_in);
+ /* update torrrent */
+ torrent.update(data_in);
/* do we need this operation to be synchronous? if we're dealing with an object with immutable
* head, e.g., multipart object we need to make sure we're the first one writing to this object
{
torrent.init(s, store);
torrent.set_create_date(mtime);
- op_ret = torrent.handle_data();
+ op_ret = torrent.complete();
if (0 != op_ret)
{
ldout(s->cct, 0) << "ERROR: torrent.handle_data() returned " << op_ret << dendl;
{
seed::info.sha1_bl.clear();
bl.clear();
- torrent_bl.clear();
s = NULL;
store = NULL;
}
return is_torrent;
}
-void seed::save_data(bufferlist &bl)
+void seed::update(bufferlist &bl)
{
if (!is_torrent)
{
return;
}
-
info.len += bl.length();
- torrent_bl.push_back(bl);
+ sha1(&h, bl, bl.length());
+}
+
+int seed::complete()
+{
+ uint64_t remain = info.len%info.piece_length;
+ uint8_t remain_len = ((remain > 0)? 1 : 0);
+ sha_len = (info.len/info.piece_length + remain_len)*CEPH_CRYPTO_SHA1_DIGESTSIZE;
+
+ int ret = 0;
+ /* produce torrent data */
+ do_encode();
+
+ /* save torrent data into OMAP */
+ ret = save_torrent_file();
+ if (0 != ret)
+ {
+ ldout(s->cct, 0) << "ERROR: failed to save_torrent_file() ret= "<< ret << dendl;
+ return ret;
+ }
+
+ return 0;
}
off_t seed::get_data_len()
}
}
-int seed::sha1_process()
-{
- uint64_t remain = info.len%info.piece_length;
- uint8_t remain_len = ((remain > 0)? 1 : 0);
- sha_len = (info.len/info.piece_length + remain_len)*CEPH_CRYPTO_SHA1_DIGESTSIZE;
-
- SHA1 h;
- list<bufferlist>::iterator iter = torrent_bl.begin();
- for (; iter != torrent_bl.end(); ++iter)
- {
- bufferlist &bl_info = *iter;
- sha1(&h, bl_info, (*iter).length());
- }
-
- return 0;
-}
-
-int seed::handle_data()
-{
- int ret = 0;
-
- /* sha1 process */
- ret = sha1_process();
- if (0 != ret)
- {
- ldout(s->cct, 0) << "ERROR: failed to sha1_process() ret= "<< ret << dendl;
- return ret;
- }
-
- /* produce torrent data */
- do_encode();
-
- /* save torrent data into OMAP */
- ret = save_torrent_file();
- if (0 != ret)
- {
- ldout(s->cct, 0) << "ERROR: failed to save_torrent_file() ret= "<< ret << dendl;
- return ret;
- }
-
- return 0;
-}
-
int seed::get_params()
{
is_torrent = true;
uint64_t sha_len; // sha1 length
bool is_torrent; // flag
bufferlist bl; // bufflist ready to send
- list<bufferlist> torrent_bl; // meate data
struct req_state *s;
RGWRados *store;
+ SHA1 h;
TorrentBencode dencode;
public:
off_t get_data_len();
bool get_flag();
- int handle_data();
- void save_data(bufferlist &bl);
void set_create_date(ceph::real_time& value);
- void set_info_name(const string& value);
+ void set_info_name(const string& value);
+ void update(bufferlist &bl);
+ int complete();
private:
void do_encode ();
void set_announce();
void set_exist(bool exist);
void set_info_pieces(char *buff);
- int sha1_process();
void sha1(SHA1 *h, bufferlist &bl, off_t bl_len);
int save_torrent_file();
};