AioCompletion *c = (AioCompletion *)handle;
return c->is_complete();
}
+
+class RGWRadosPutObj : public RGWGetDataCB
+{
+ rgw_obj obj;
+public:
+ RGWRadosPutObj(rgw_obj& _o) : obj(_o) {}
+ int handle_data(bufferlist& bl, off_t ofs, off_t len) {
+ return 0;
+ }
+};
+
/**
* Copy an object.
* dest_obj: the object to copy into
map<string, bufferlist> src_attrs;
RGWRESTStreamReadRequest *in_stream_req;
+ RGWRadosPutObj cb(dest_obj);
- int ret = rest_conn->get_obj_init(user_id, src_obj, &in_stream_req);
- if (ret < 0)
- return ret;
-#if 0
- ret = get_obj_iterate(ctx, &handle, src_obj, 0, astate->size - 1, out_stream_req->get_out_cb());
+ int ret = rest_conn->get_obj(user_id, src_obj, &cb, &in_stream_req);
if (ret < 0)
return ret;
-#endif
string etag;
return status;
}
-int RGWRESTStreamReadRequest::get_obj_init(RGWAccessKey& key, rgw_obj& obj)
+int RGWRESTStreamReadRequest::get_obj(RGWAccessKey& key, rgw_obj& obj)
{
string resource = obj.bucket.name + "/" + obj.object;
string new_url = url;
return status;
}
-int RGWRESTStreamReadRequest::send_data(void *ptr, size_t len) {
+int RGWRESTStreamReadRequest::receive_data(void *ptr, size_t len)
+{
+ bufferptr bp((const char *)ptr, len);
+ bufferlist bl;
+ bl.append(bp);
+ int ret = cb->handle_data(bl, ofs, len);
+ if (ret < 0)
+ return ret;
+ ofs += len;
+ return len;
+#if 0
+ return cb->handle_data(bl
+ const char *p = (const char *)ptr;
+ size_t orig_len = len;
+ while (len > 0) {
+ size_t read_len = RGW_MAX_CHUNK_SIZE - chunk_ofs;
+ if (read_len > len)
+ read_len = len;
+
+ bufferptr bp((const char *)p, read_len);
+ in_data.append(bp);
+
+ p += read_len;
+ len -= read_len;
+ chunk_ofs += read_len;
+ if (chunk_ofs == RGW_MAX_CHUNK_SIZE) {
+ chunk_ofs = 0;
+ size_t data_len = in_data.length();
+ int r = cb->handle_data(in_data, ofs, data_len);
+ if (r < 0)
+ return r;
+
+ ofs += data_len;
+
+ in_data.clear();
+ }
+ }
+
+ return orig_len;
+#endif
+}
+
+int RGWRESTStreamReadRequest::send_data(void *ptr, size_t len)
+{
+ /* not sending any data */
return 0;
}
class RGWRESTStreamReadRequest : public RGWRESTSimpleRequest {
Mutex lock;
- void *handle;
RGWGetDataCB *cb;
+ bufferlist in_data;
+ size_t chunk_ofs;
+ size_t ofs;
public:
int send_data(void *ptr, size_t len);
+ int receive_data(void *ptr, size_t len);
- RGWRESTStreamReadRequest(CephContext *_cct, string& _url, list<pair<string, string> > *_headers,
+ RGWRESTStreamReadRequest(CephContext *_cct, string& _url, RGWGetDataCB *_cb, list<pair<string, string> > *_headers,
list<pair<string, string> > *_params) : RGWRESTSimpleRequest(_cct, _url, _headers, _params),
- lock("RGWRESTStreamReadRequest"), handle(NULL), cb(NULL) {}
+ lock("RGWRESTStreamReadRequest"), cb(_cb),
+ chunk_ofs(0), ofs(0) {}
~RGWRESTStreamReadRequest() {}
- int get_obj_init(RGWAccessKey& key, rgw_obj& obj);
+ int get_obj(RGWAccessKey& key, rgw_obj& obj);
int complete(string& etag, time_t *mtime);
void set_in_cb(RGWGetDataCB *_cb) { cb = _cb; }
return ret;
}
-int RGWRegionConnection::get_obj_init(const string& uid, rgw_obj& obj, RGWRESTStreamReadRequest **req)
+int RGWRegionConnection::get_obj(const string& uid, rgw_obj& obj, RGWGetDataCB *cb, RGWRESTStreamReadRequest **req)
{
string url;
int ret = get_url(url);
list<pair<string, string> > params;
params.push_back(make_pair<string, string>(RGW_SYS_PARAM_PREFIX "uid", uid));
params.push_back(make_pair<string, string>(RGW_SYS_PARAM_PREFIX "region", region));
- *req = new RGWRESTStreamReadRequest(cct, url, NULL, ¶ms);
- return (*req)->get_obj_init(key, obj);
+ *req = new RGWRESTStreamReadRequest(cct, url, cb, NULL, ¶ms);
+ return (*req)->get_obj(key, obj);
}
int RGWRegionConnection::complete_request(RGWRESTStreamReadRequest *req, string& etag, time_t *mtime)
map<string, bufferlist>& attrs, RGWRESTStreamWriteRequest **req);
int complete_request(RGWRESTStreamWriteRequest *req, string& etag, time_t *mtime);
- int get_obj_init(const string& uid, rgw_obj& obj, RGWRESTStreamReadRequest **req);
+ int get_obj(const string& uid, rgw_obj& obj, RGWGetDataCB *cb, RGWRESTStreamReadRequest **req);
int complete_request(RGWRESTStreamReadRequest *req, string& etag, time_t *mtime);
};