themblem/alg/fileprocess.cpp
2024-09-01 21:51:50 +01:00

85 lines
2.7 KiB
C++

#include "fileprocess.h"
#include "fileprocess.grpc.pb.h"
#include <grpc++/server_builder.h>
using namespace std;
using namespace grpc;
using namespace fileprocess;
class FileProcessServer final : public FileProcess::Service {
handler_fn _handle_image;
Status ProcessFiles(ServerContext* context, const Files* request,
Output *resp) override {
printf("process files\n");
for (auto file: request->files()) {
printf("file: %s\n", file.path().c_str());
string output_path;
vector<uint8_t> output;
vector<uint8_t> input(file.data().begin(), file.data().end());
auto r = _handle_image(file.path(), input, output_path, output);
auto d = resp->add_files();
if (r) {
d->set_succeeded(false);
d->set_error("Failed to process image");
} else {
d->set_succeeded(true);
d->set_path(output_path);
string data(output.begin(), output.end());
d->set_data(data);
}
}
printf("done\n");
return Status::OK;
}
#if 0
Status ProcessArchive(ServerContext* context, ServerReaderWriter<Output, ArchiveFile> *stream) override {
ArchiveFile request;
while (stream->Read(&request)) {
if (request.data().size() <= 0) continue;
string output_path;
vector<uint8_t> output;
vector<uint8_t> input(request.data().begin(), request.data().end());
string path = request.path();
path += string("-files/") + request.path_in_archive();
auto r = _handle_image(path, input, output_path, output);
Output d;
if (r) {
d.set_succeeded(false);
string error = "Failed to process image " + request.path_in_archive();
d.set_error(error);
} else {
d.set_succeeded(true);
d.set_path(output_path);
string data(output.begin(), output.end());
d.set_data(data);
}
stream->Write(d);
}
return Status::OK;
}
#endif
public:
FileProcessServer(handler_fn handle_image) :
_handle_image(handle_image)
{
}
};
int run_server(const string &server_addr, handler_fn handle_image) {
FileProcessServer service(handle_image);
ServerBuilder builder;
builder.AddListeningPort(server_addr, grpc::InsecureServerCredentials());
builder.RegisterService(&service);
builder.SetMaxSendMessageSize(128 * 1024 * 1024);
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_addr << std::endl;
server->Wait();
return 0;
}