#include #include "../services.hpp" #include "../fileshare.hpp" #include "component/platform.hpp" #include namespace demonware { bdPooledStorage::bdPooledStorage() : service(58, "bdPooledStorage") { this->register_task(1, &bdPooledStorage::getPooledMetaDataByID); this->register_task(5, &bdPooledStorage::_preUpload); this->register_task(6, &bdPooledStorage::_postUploadFile); this->register_task(8, &bdPooledStorage::remove); this->register_task(9, &bdPooledStorage::_preDownload); this->register_task(17, &bdPooledStorage::_preUploadSummary); this->register_task(18, &bdPooledStorage::_postUploadSummary); this->register_task(19, &bdPooledStorage::_preDownloadSummary); this->register_task(20, &bdPooledStorage::_preUploadMultiPart); this->register_task(21, &bdPooledStorage::_postUploadMultiPart); this->register_task(22, &bdPooledStorage::_preDownloadMultiPart); } void bdPooledStorage::getPooledMetaDataByID(service_server* server, byte_buffer* buffer) const { std::vector requested_files; buffer->read_array(10, &requested_files); auto reply = server->create_reply(this->task_id()); for (auto fileID : requested_files) { std::string metafile = fileshare::get_metadata_path(fileshare::get_file_name(fileID)); fileshare::FileMetadata metadata; if (metadata.ReadMetaDataJson(metafile, metadata.FILE_STATUS_DESCRIBED) && utilities::io::file_exists(fileshare::get_file_path(metadata.fileName))) { auto taskResult = new bdFileMetaData; metadata.MetadataTaskResult(taskResult, false); reply->add(taskResult); } } reply->send(); } void bdPooledStorage::_preUpload(service_server* server, byte_buffer* buffer) const { std::string filename; uint16_t category; buffer->read_string(&filename); buffer->read_uint16(&category); uint32_t timestamp = static_cast(time(nullptr)); fileshare::FileMetadata metadata; metadata.file.id = timestamp; metadata.file.name = filename; metadata.file.timestamp = timestamp; metadata.author.xuid = platform::bnet_get_userid(); metadata.author.name = platform::bnet_get_username(); metadata.category = static_cast(category); metadata.fileName = fileshare::get_file_name(metadata.file.id, metadata.category); metadata.WriteMetaDataJson(fileshare::get_metadata_path(metadata.fileName), metadata.FILE_STATUS_UPLOADING); auto reply = server->create_reply(this->task_id()); auto result = new bdURL; result->m_url = fileshare::get_file_url(metadata.fileName); result->m_serverType = 8; result->m_serverIndex = "fs"; result->m_fileID = metadata.file.id; reply->add(result); reply->send(); } void bdPooledStorage::_postUploadFile(service_server* server, byte_buffer* buffer) const { uint64_t fileID; uint32_t fileSize; uint16_t serverType; std::string serverIndex; buffer->read_uint64(&fileID); buffer->read_uint16(&serverType); buffer->read_string(&serverIndex); buffer->read_uint32(&fileSize); auto metafile = fileshare::get_metadata_path(fileshare::get_file_name(fileID)); fileshare::FileMetadata metadata; if (metadata.ReadMetaDataJson(metafile)) { metadata.file.size = fileSize; metadata.fileSize = utilities::io::file_size(fileshare::get_file_path(metadata.fileName)); metadata.WriteMetaDataJson(metafile, metadata.FILE_STATUS_UPLOADED); } auto reply = server->create_reply(this->task_id()); auto result = new bdUInt64Result; result->value = fileID; reply->add(result); reply->send(); } void bdPooledStorage::remove(service_server* server, byte_buffer* /*buffer*/) const { // TODO: auto reply = server->create_reply(this->task_id()); reply->send(); } void bdPooledStorage::_preDownload(service_server* server, byte_buffer* buffer) const { uint64_t fileID; buffer->read_uint64(&fileID); std::string metafile = fileshare::get_metadata_path(fileshare::get_file_name(fileID)); fileshare::FileMetadata metadata; if (metadata.ReadMetaDataJson(metafile, metadata.FILE_STATUS_DESCRIBED) && utilities::io::file_exists(fileshare::get_file_path(metadata.fileName))) { auto reply = server->create_reply(this->task_id()); auto taskResult = new bdFileMetaData; metadata.MetadataTaskResult(taskResult, true); reply->add(taskResult); reply->send(); } else { auto reply = server->create_reply(this->task_id(), 2000/*BD_CONTENTSTREAMING_FILE_NOT_AVAILABLE*/); reply->send(); } } void bdPooledStorage::_preUploadSummary(service_server* server, byte_buffer* buffer) const { uint64_t fileID{}; uint32_t fileSize{}; //std::string DDL_MetaData; buffer->read_uint64(&fileID); buffer->read_uint32(&fileSize); auto metafile = fileshare::get_metadata_path(fileshare::get_file_name(fileID)); fileshare::FileMetadata metadata; if (metadata.ReadMetaDataJson(metafile)) { buffer->read_blob(&metadata.ddl_metadata); buffer->read_array(10, &metadata.tags); metadata.WriteMetaDataJson(metafile, metadata.FILE_STATUS_DESCRIBED); } auto reply = server->create_reply(this->task_id(), 108/*BD_SERVICE_NOT_AVAILABLE*/); reply->send(); } void bdPooledStorage::_postUploadSummary(service_server* server, byte_buffer* /*buffer*/) const { auto reply = server->create_reply(this->task_id()); reply->send(); } void bdPooledStorage::_preDownloadSummary(service_server* server, byte_buffer* /*buffer*/) const { // TODO: auto reply = server->create_reply(this->task_id()); reply->send(); } void bdPooledStorage::_preUploadMultiPart(service_server* server, byte_buffer* /*buffer*/) const { // TODO: auto reply = server->create_reply(this->task_id()); reply->send(); } void bdPooledStorage::_postUploadMultiPart(service_server* server, byte_buffer* /*buffer*/) const { // TODO: auto reply = server->create_reply(this->task_id()); reply->send(); } void bdPooledStorage::_preDownloadMultiPart(service_server* server, byte_buffer* /*buffer*/) const { // TODO: auto reply = server->create_reply(this->task_id()); reply->send(); } }