Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions include/cos_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -835,6 +835,10 @@ class CosAPI {
// https://cloud.tencent.com/document/product/436/54058
CosResult DocPreview(const DocPreviewReq& req, DocPreviewResp* resp);

/*** 存储桶绑定文档预览 ***/
CosResult CreateDocBucket(const CreateDocBucketReq& req,
CreateDocBucketResp* resp);

/*** 提交一个文档预览任务 ***/
// https://cloud.tencent.com/document/product/436/54056
CosResult CreateDocProcessJobs(const CreateDocProcessJobsReq& req,
Expand Down
14 changes: 11 additions & 3 deletions include/op/bucket_op.h
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,14 @@ class BucketOp : public BaseOp {
CosResult PutBucketToCI(const PutBucketToCIReq& req,
PutBucketToCIResp* resp);

/// \brief 开通文档预览
/// \param req CreateDocBucket请求
/// \param resp CreateDocBucket返回
///
/// \return 本次请求的调用情况(如状态码等)
CosResult CreateDocBucket(const CreateDocBucketReq& req,
CreateDocBucketResp* resp);

/// \brief 提交文档转码任务
/// \brief https://cloud.tencent.com/document/product/436/54056
/// \param req CreateDocProcessJobs请求
Expand Down Expand Up @@ -467,10 +475,10 @@ class BucketOp : public BaseOp {

/// \brief 开通媒体处理
/// \brief https://cloud.tencent.com/document/product/436/72824
/// \param req DescribeMediaBuckets请求
/// \param resp DescribeMediaBuckets返回
/// \param req CreateMediaBucketReq请求
/// \param resp CreateMediaBucketResp返回
///
/// \return 本次请求的调用情况(如状态码等)
/// \return 本次请求的调用情况(如状态码等)
CosResult CreateMediaBucket(const CreateMediaBucketReq& req,
CreateMediaBucketResp* resp);
/// \brief 获取媒体文件信息
Expand Down
23 changes: 23 additions & 0 deletions include/request/data_process_req.h
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,18 @@ struct BucketInfo {
}
};

struct CreateDocBucketResult {
std::string request_id; // 请求的唯一ID
BucketInfo doc_bucket; // 媒体Bucket
std::string to_string() const {
std::stringstream ss;
ss << "request_id: " << request_id << std::endl;
ss << doc_bucket.to_string() << std::endl;
ss << std::endl;
return ss.str();
}
};

struct DocBucketResponse {
std::string request_id; // 请求的唯一 ID
int total_count; // 文档预览 Bucket 总数
Expand Down Expand Up @@ -667,6 +679,17 @@ class GetQRcodeReq : public ObjectReq {
void EnableCover() { AddParam("cover", "1"); }
};

class CreateDocBucketReq : public BucketReq{
public:
CreateDocBucketReq(const std::string& bucket_name) : BucketReq(bucket_name) {
m_method = "POST";
m_path = "/docbucket";
SetHttps();
}

virtual ~CreateDocBucketReq() {}
};

class DescribeDocProcessBucketsReq : public BaseReq {
public:
DescribeDocProcessBucketsReq() {
Expand Down
12 changes: 12 additions & 0 deletions include/response/data_process_resp.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,18 @@ class PutBucketToCIResp : public BaseResp {
virtual ~PutBucketToCIResp() {}
};

class CreateDocBucketResp : public BaseResp {
public:
CreateDocBucketResp() {}
virtual ~CreateDocBucketResp() {}
virtual bool ParseFromXmlString(const std::string& body);

CreateDocBucketResult GetResult() const { return m_result; }

private:
CreateDocBucketResult m_result;
};

class CreateMediaBucketResp : public BaseResp {
public:
CreateMediaBucketResp() {}
Expand Down
2 changes: 2 additions & 0 deletions include/util/test_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ class TestUtils {
static std::string CalcStringMd5(const std::string& str);
static std::string CalcStreamSHA1(std::istream& is);
static std::string GetEnvVar(const std::string& env_var_name);
#if defined(__linux__)
static bool IsDirectoryExists(const std::string& path);
static bool MakeDirectory(const std::string& path);
static bool RemoveDirectory(const std::string& path);
#endif
};
#define GetEnvVar TestUtils::GetEnvVar

Expand Down
7 changes: 6 additions & 1 deletion src/cos_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,7 @@ CosResult CosAPI::MoveObject(const MoveObjectReq& req) {
}
CosResult CosAPI::PutBucketToCI(const PutBucketToCIReq& req,
PutBucketToCIResp* resp) {
return m_bucket_op.PutBucketToCI(req, resp);
return m_bucket_op.PutBucketToCI(req, resp);
}

CosResult CosAPI::PutImage(PutImageByFileReq& req,
Expand All @@ -737,6 +737,11 @@ CosAPI::DescribeDocProcessBuckets(const DescribeDocProcessBucketsReq& req,
return m_object_op.DescribeDocProcessBuckets(req, resp);
}

CosResult CosAPI::CreateDocBucket(const CreateDocBucketReq& req,
CreateDocBucketResp* resp) {
return m_bucket_op.CreateDocBucket(req, resp);
}

CosResult CosAPI::DocPreview(const DocPreviewReq& req, DocPreviewResp* resp) {
return m_object_op.DocPreview(req, resp);
}
Expand Down
7 changes: 7 additions & 0 deletions src/op/bucket_op.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,13 @@ CosResult BucketOp::ProcessReq(const BucketReq& req, BaseResp* resp,
}
}

CosResult BucketOp::CreateDocBucket(const CreateDocBucketReq& req,
CreateDocBucketResp* resp) {
std::string host = CosSysConfig::GetCIHost(req.GetBucketName(), m_config->GetRegion());
std::string path = req.GetPath();
return NormalAction(host, path, req, "", false, resp);
}

CosResult BucketOp::CreateDocProcessJobs(const CreateDocProcessJobsReq& req,
CreateDocProcessJobsResp* resp) {
return ProcessReq(req, resp, true);
Expand Down
55 changes: 34 additions & 21 deletions src/response/data_process_resp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,39 @@ bool DescribeDocProcessBucketsResp::ParseFromXmlString(
return true;
}

bool CreateDocBucketResp::ParseFromXmlString(const std::string& body) {
std::string tmp_body = body;
rapidxml::xml_document<> doc;

if (!StringUtil::StringToXml(&tmp_body[0], &doc)) {
SDK_LOG_ERR("Parse string to xml doc error, xml_body=%s", body.c_str());
return false;
}

rapidxml::xml_node<>* root = doc.first_node("Response");
if (NULL == root) {
SDK_LOG_ERR("Missing root node Response, xml_body=%s", body.c_str());
return false;
}

rapidxml::xml_node<>* node = root->first_node();
for (; node != NULL; node = node->next_sibling()) {
const std::string& node_name = node->name();
if ("RequestId" == node_name) {
m_result.request_id = node->value();
} else if ("DocBucket" == node_name) {
BucketInfo bucket_info;
DescribeDocProcessBucketsResp::ParseBucketInfo(node, bucket_info);
m_result.doc_bucket = bucket_info;
} else {
SDK_LOG_WARN("Unknown field in Response, field_name=%s",
node_name.c_str());
return false;
}
}
return true;
}

bool DescribeDocProcessBucketsResp::ParseBucketInfo(rapidxml::xml_node<>* root,
BucketInfo& bucket_info) {
rapidxml::xml_node<>* node = root->first_node();
Expand Down Expand Up @@ -337,10 +370,6 @@ bool DocProcessJobBase::ParseJobsDetail(rapidxml::xml_node<>* root,
jobs_detail.input.object = object_node->value();
} else if ("Operation" == node_name) {
ParseOperation(jobs_detail_node, jobs_detail.operation);
} else {
SDK_LOG_WARN("Unknown field in JobsDetail, field_name=%s",
node_name.c_str());
return false;
}
}
return true;
Expand All @@ -367,9 +396,6 @@ bool DocProcessJobBase::ParseOperation(rapidxml::xml_node<>* root,
operation.output.bucket = output_node->value();
}
}
} else {
SDK_LOG_WARN("Unknown field in Operation, field_name=%s",
node_name.c_str());
}
}
return true;
Expand Down Expand Up @@ -408,9 +434,6 @@ bool DocProcessJobBase::ParseDocProcess(rapidxml::xml_node<>* root,
doc_process.quality = StringUtil::StringToInt(doc_process_node->value());
} else if (doc_process_node_name == "Zoom") {
doc_process.zoom = StringUtil::StringToInt(doc_process_node->value());
} else {
SDK_LOG_WARN("Unknown field in DocProcess, field_name=%s",
doc_process_node_name.c_str());
}
}
return true;
Expand Down Expand Up @@ -461,9 +484,6 @@ bool DocProcessJobBase::ParseDocProcessResult(
} else if (doc_process_result_node_name == "TotalSheetCount") {
doc_process_result.total_sheetcount =
StringUtil::StringToInt(doc_process_result_node->value());
} else {
SDK_LOG_WARN("Unknown field in DocProcessResult, field_name=%s",
doc_process_result_node_name.c_str());
}
}
return true;
Expand Down Expand Up @@ -554,10 +574,6 @@ bool DocProcessQueueBase::ParseQueueList(rapidxml::xml_node<>* root,
queue_list.bucket_id = queue_list_node->value();
} else if ("Category" == queue_list_node_name) {
queue_list.category = queue_list_node->value();
} else {
SDK_LOG_WARN("Unknown field in QueueList, field_name=%s",
queue_list_node_name.c_str());
return false;
}
}
return true;
Expand Down Expand Up @@ -593,10 +609,6 @@ bool DescribeDocProcessQueuesResp::ParseFromXmlString(const std::string& body) {
ParseQueueList(node, m_queue_list);
} else if ("NonExistPIDs" == node_name) {
ParseNonExistPIDs(node, m_non_exist_pids);
} else {
SDK_LOG_WARN("Unknown field in Response, field_name=%s",
node_name.c_str());
return false;
}
}
return true;
Expand Down Expand Up @@ -671,6 +683,7 @@ bool DescribeMediaBucketsResp::ParseFromXmlString(const std::string& body) {
}
return true;
}

bool CreateMediaBucketResp::ParseFromXmlString(const std::string& body) {
std::string tmp_body = body;
rapidxml::xml_document<> doc;
Expand Down
4 changes: 4 additions & 0 deletions src/util/test_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@

#include <fstream>
#include <sstream>
#if defined(__linux__)
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#endif

#include "Poco/DigestStream.h"
#include "Poco/MD5Engine.h"
Expand Down Expand Up @@ -80,6 +82,7 @@ std::string TestUtils::GetEnvVar(const std::string& env_var_name) {

return std::string(tmp);
}
#if defined(__linux__)
bool TestUtils::IsDirectoryExists(const std::string& path) {
struct stat info;
if (0 == stat(path.c_str(), &info) && info.st_mode & S_IFDIR) {
Expand All @@ -102,4 +105,5 @@ bool TestUtils::RemoveDirectory(const std::string& path) {
return false;
}
}
#endif
} // namespace qcloud_cos
58 changes: 55 additions & 3 deletions unittest/src/async_op_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -559,9 +559,9 @@ TEST_F(AsyncOpTest, AsyncPutByStreamWithDoneCallback) {
}

TEST_F(AsyncOpTest, AsyncPutByStreamWithDoneCallbackWithOutputTaskManager) {
size_t file_size = 100 * 1024 * 1024;
std::string object_name = "test_async_by_stream_" + std::to_string(file_size);
{
size_t file_size = ((rand() % 100) + 1) * 1024;
std::string object_name = "test_async_by_stream_" + std::to_string(file_size);
std::istringstream iss(TestUtils::GetRandomString(file_size));
// 完成回调
auto multi_put_done_cb = [](const SharedAsyncContext& context,
Expand Down Expand Up @@ -590,7 +590,59 @@ TEST_F(AsyncOpTest, AsyncPutByStreamWithDoneCallbackWithOutputTaskManager) {
CHECK_COMMON_RESULT(context->GetResult())
AsyncResp put_resp = context->GetAsyncResp();
CHECK_COMMON_RESP(put_resp)

}
{
//异步下载
Poco::TaskManager* taskManager;
auto multi_get_done_cb = [](const SharedAsyncContext& context,
void* user_data) {
std::cout << "multi async download object: " << context->GetResult().IsSucc()
<< std::endl;
};
std::string local_file_download = object_name + "_download";
std::cout << "multi async download object: " << object_name
<< std::endl;
qcloud_cos::AsyncGetObjectReq get_req(m_bucket_name, object_name,
local_file_download);
// 设置完成回调
get_req.SetDoneCallback(multi_get_done_cb);
SharedAsyncContext context = m_client->AsyncResumableGetObject(get_req, taskManager);
// 取消下载
context->Cancel();
context->WaitUntilFinish();
taskManager->joinAll();
ASSERT_TRUE(!context->GetResult().IsSucc());
context = m_client->AsyncResumableGetObject(get_req, taskManager);
context->WaitUntilFinish();
taskManager->joinAll();
ASSERT_TRUE(context->GetResult().IsSucc());
TestUtils::RemoveFile(local_file_download);
}
{
//异步下载
auto multi_get_done_cb = [](const SharedAsyncContext& context,
void* user_data) {
std::cout << "multi async download object: " << context->GetResult().IsSucc()
<< std::endl;
};
std::string local_file_download = object_name + "_download";
std::cout << "multi async download object: " << object_name
<< std::endl;
qcloud_cos::AsyncGetObjectReq get_req(m_bucket_name, object_name,
local_file_download);
// 设置完成回调
get_req.SetDoneCallback(multi_get_done_cb);
SharedAsyncContext context = m_client->AsyncResumableGetObject(get_req);
//取消下载
context->Cancel();
context->WaitUntilFinish();
ASSERT_TRUE(!context->GetResult().IsSucc());
context = m_client->AsyncResumableGetObject(get_req);
context->WaitUntilFinish();
ASSERT_TRUE(context->GetResult().IsSucc());
TestUtils::RemoveFile(local_file_download);
}
{
// 删除对象
CosResult del_result;
qcloud_cos::DeleteObjectReq del_req(m_bucket_name, object_name);
Expand Down
Loading