mirror of
https://git.tesses.org/tesses50/tessesframework.git
synced 2026-06-01 10:05:31 +00:00
Overhaul cmake configuration, add console api, fix http code that caused issues with cgi-bin
This commit is contained in:
@@ -6,18 +6,15 @@ using namespace Tesses::Framework::Filesystem;
|
||||
using namespace Tesses::Framework::Serialization::Bencode;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
using namespace Tesses::Framework::BitTorrent;
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
TF_Init();
|
||||
if(argc < 2)
|
||||
{
|
||||
printf("USAGE: %s /path/to/torrent/file\n",argv[0]);
|
||||
if (argc < 2) {
|
||||
printf("USAGE: %s /path/to/torrent/file\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
auto strm = LocalFS->OpenFile((std::string)argv[1],"rb");
|
||||
auto strm = LocalFS->OpenFile((std::string)argv[1], "rb");
|
||||
auto bencode = Bencode::Load(strm);
|
||||
if(std::holds_alternative<BeDictionary>(bencode))
|
||||
{
|
||||
if (std::holds_alternative<BeDictionary>(bencode)) {
|
||||
|
||||
TorrentFile file(std::get<BeDictionary>(bencode));
|
||||
file.Print(std::make_shared<ConsoleWriter>());
|
||||
|
||||
@@ -7,83 +7,84 @@ using namespace Tesses::Framework::Filesystem;
|
||||
|
||||
std::shared_ptr<VFS> vfs;
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
TF_InitWithConsole();
|
||||
vfs = std::make_shared<SubdirFilesystem>(LocalFS,Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory());
|
||||
vfs = std::make_shared<SubdirFilesystem>(
|
||||
LocalFS,
|
||||
Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory());
|
||||
|
||||
std::shared_ptr<CallbackServer> cb = std::make_shared<CallbackServer>([](ServerContext& ctx)->bool{
|
||||
if(ctx.path == "/")
|
||||
{
|
||||
std::shared_ptr<CallbackServer> cb = std::make_shared<
|
||||
CallbackServer>([](ServerContext &ctx) -> bool {
|
||||
if (ctx.path == "/") {
|
||||
ctx.WithMimeType("text/html")
|
||||
.SendText(
|
||||
"<!DOCTYPE html>"
|
||||
"<html>"
|
||||
"<head><meta charset=\"UTF-8\"><title>AnonyDrop</title><meta name=\"color-scheme\" content=\"dark light\"></head>"
|
||||
"<body>"
|
||||
"<h1>AnonyDrop</h1>"
|
||||
"<a href=\"./files/\">Files</a>"
|
||||
"<form action=\"./upload\" method=\"post\" enctype=\"multipart/form-data\" accept-charset=\"UTF-8\">"
|
||||
"<input type=\"file\" name=\"file\" multiple>"
|
||||
"<input type=\"submit\" value=\"Upload\">"
|
||||
"</form>"
|
||||
"</body>"
|
||||
"</html>"
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
else if(ctx.path == "/upload")
|
||||
{
|
||||
if(ctx.NeedToParseFormData())
|
||||
{
|
||||
ctx.ParseFormData([](std::string mime, std::string filename,std::string name)->std::shared_ptr<Stream> {
|
||||
if(name != "file") return nullptr;
|
||||
VFSPath path("/"+filename);
|
||||
auto strm = vfs->OpenFile(path,"wb");
|
||||
|
||||
return strm;
|
||||
});
|
||||
ctx.WithMimeType("text/html")
|
||||
.SendText(
|
||||
"<!DOCTYPE html>"
|
||||
"<html>"
|
||||
"<head><meta name=\"color-scheme\" content=\"dark light\"><title>AnonyDrop - Uploaded successfully</title></head>"
|
||||
"<head><meta "
|
||||
"charset=\"UTF-8\"><title>AnonyDrop</title><meta "
|
||||
"name=\"color-scheme\" content=\"dark light\"></head>"
|
||||
"<body>"
|
||||
"<h1>Uploaded successfully</h1>"
|
||||
"<a href=\"./\">Back</a>"
|
||||
|
||||
"</body>"
|
||||
"</html>"
|
||||
);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
ctx.statusCode= Tesses::Framework::Http::BadRequest;
|
||||
ctx.WithMimeType("text/html")
|
||||
.SendText(
|
||||
"<!DOCTYPE html>"
|
||||
"<html>"
|
||||
"<head><title>AnonyDump - Error: Must contain multipart and POST</title>"
|
||||
"<body>"
|
||||
"<h1>Error: Must contain multipart and POST</h1>"
|
||||
"<a href=\"./\">Back</a>"
|
||||
|
||||
"<h1>AnonyDrop</h1>"
|
||||
"<a href=\"./files/\">Files</a>"
|
||||
"<form action=\"./upload\" method=\"post\" "
|
||||
"enctype=\"multipart/form-data\" accept-charset=\"UTF-8\">"
|
||||
"<input type=\"file\" name=\"file\" multiple>"
|
||||
"<input type=\"submit\" value=\"Upload\">"
|
||||
"</form>"
|
||||
"</body>"
|
||||
"</html>"
|
||||
);
|
||||
"</html>");
|
||||
|
||||
return true;
|
||||
} else if (ctx.path == "/upload") {
|
||||
if (ctx.NeedToParseFormData()) {
|
||||
ctx.ParseFormData(
|
||||
[](std::string mime, std::string filename,
|
||||
std::string name) -> std::shared_ptr<Stream> {
|
||||
if (name != "file")
|
||||
return nullptr;
|
||||
VFSPath path("/" + filename);
|
||||
auto strm = vfs->OpenFile(path, "wb");
|
||||
|
||||
return strm;
|
||||
});
|
||||
ctx.WithMimeType("text/html")
|
||||
.SendText("<!DOCTYPE html>"
|
||||
"<html>"
|
||||
"<head><meta name=\"color-scheme\" "
|
||||
"content=\"dark light\"><title>AnonyDrop - "
|
||||
"Uploaded successfully</title></head>"
|
||||
"<body>"
|
||||
"<h1>Uploaded successfully</h1>"
|
||||
"<a href=\"./\">Back</a>"
|
||||
|
||||
"</body>"
|
||||
"</html>");
|
||||
return true;
|
||||
} else {
|
||||
ctx.statusCode = Tesses::Framework::Http::BadRequest;
|
||||
ctx.WithMimeType("text/html")
|
||||
.SendText("<!DOCTYPE html>"
|
||||
"<html>"
|
||||
"<head><title>AnonyDump - Error: Must contain "
|
||||
"multipart and POST</title>"
|
||||
"<body>"
|
||||
"<h1>Error: Must contain multipart and POST</h1>"
|
||||
"<a href=\"./\">Back</a>"
|
||||
|
||||
"</form>"
|
||||
"</body>"
|
||||
"</html>");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
auto mountable = std::make_shared<Tesses::Framework::Http::MountableServer>(cb);
|
||||
mountable->Mount("/files/",std::make_shared<FileServer>(vfs,true,false));
|
||||
auto mountable =
|
||||
std::make_shared<Tesses::Framework::Http::MountableServer>(cb);
|
||||
mountable->Mount("/files/", std::make_shared<FileServer>(vfs, true, false));
|
||||
|
||||
HttpServer srv(4985,mountable);
|
||||
HttpServer srv(4985, mountable);
|
||||
srv.StartAccepting();
|
||||
|
||||
TF_RunEventLoop();
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
#include "TessesFramework/TessesFramework.hpp"
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if(argc < 4)
|
||||
{
|
||||
std::cout << "USAGE: " << argv[0] << " BINARYFILE VARNAME HEADERFILE" << std::endl;
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 4) {
|
||||
std::cout << "USAGE: " << argv[0] << " BINARYFILE VARNAME HEADERFILE"
|
||||
<< std::endl;
|
||||
return 0;
|
||||
}
|
||||
auto fs=std::make_shared<Tesses::Framework::Streams::FileStream>(argv[1],"rb");
|
||||
if(!fs->CanRead()) return 1;
|
||||
auto writer = std::make_shared<Tesses::Framework::TextStreams::StreamWriter>(argv[3]);
|
||||
auto fs =
|
||||
std::make_shared<Tesses::Framework::Streams::FileStream>(argv[1], "rb");
|
||||
if (!fs->CanRead())
|
||||
return 1;
|
||||
auto writer =
|
||||
std::make_shared<Tesses::Framework::TextStreams::StreamWriter>(argv[3]);
|
||||
Tesses::Framework::Text::GenerateCHeaderFile(fs, argv[2], writer);
|
||||
return 0;
|
||||
}
|
||||
@@ -3,20 +3,18 @@ using namespace Tesses::Framework;
|
||||
using namespace Tesses::Framework::BitTorrent;
|
||||
using namespace Tesses::Framework::Serialization::Bencode;
|
||||
using namespace Tesses::Framework::Filesystem;
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
TF_Init();
|
||||
if(argc < 2)
|
||||
{
|
||||
printf("USAGE: %s torrent_file\n",argv[0]);
|
||||
if (argc < 2) {
|
||||
printf("USAGE: %s torrent_file\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
auto strm = LocalFS->OpenFile((std::string)argv[1],"rb");
|
||||
auto strm = LocalFS->OpenFile((std::string)argv[1], "rb");
|
||||
auto data = Bencode::Load(strm);
|
||||
if(std::holds_alternative<BeDictionary>(data)){
|
||||
std::get<BeDictionary>(data).SetValue("url-list",BeUndefined());
|
||||
if (std::holds_alternative<BeDictionary>(data)) {
|
||||
std::get<BeDictionary>(data).SetValue("url-list", BeUndefined());
|
||||
}
|
||||
strm = LocalFS->OpenFile((std::string)argv[1],"wb");
|
||||
Bencode::Save(strm,data);
|
||||
strm = LocalFS->OpenFile((std::string)argv[1], "wb");
|
||||
Bencode::Save(strm, data);
|
||||
return 0;
|
||||
}
|
||||
@@ -2,44 +2,34 @@
|
||||
using namespace Tesses::Framework::Streams;
|
||||
using namespace Tesses::Framework::Serialization::Json;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest)
|
||||
{
|
||||
if(dest == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdout,false,"w");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(dest,"w");
|
||||
if(!strm->CanWrite())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
|
||||
if (dest == "-") {
|
||||
return std::make_shared<FileStream>(stdout, false, "w");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(dest, "w");
|
||||
if (!strm->CanWrite()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src)
|
||||
{
|
||||
if(src == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdin,false,"r");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(src,"r");
|
||||
if(!strm->CanRead())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src) {
|
||||
if (src == "-") {
|
||||
return std::make_shared<FileStream>(stdin, false, "r");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(src, "r");
|
||||
if (!strm->CanRead()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if(argc < 3)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 3) {
|
||||
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
|
||||
std::cout << "SRC: doc json file or - for stdin to convert to pretty json" << std::endl;
|
||||
std::cout
|
||||
<< "SRC: doc json file or - for stdin to convert to pretty json"
|
||||
<< std::endl;
|
||||
std::cout << "DEST: prettied file or - for stdout" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -47,14 +37,12 @@ int main(int argc, char** argv)
|
||||
|
||||
auto dest = OpenWrite(argv[2]);
|
||||
|
||||
if(src == nullptr)
|
||||
{
|
||||
|
||||
if (src == nullptr) {
|
||||
|
||||
std::cerr << "ERROR: Input could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
if(dest == nullptr)
|
||||
{
|
||||
if (dest == nullptr) {
|
||||
std::cerr << "ERROR: Output could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
@@ -65,6 +53,5 @@ int main(int argc, char** argv)
|
||||
auto str = reader.ReadToEnd();
|
||||
writer.WriteLine(Json::Encode(Json::DocDecode(str)));
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -3,25 +3,22 @@
|
||||
using namespace Tesses::Framework;
|
||||
using namespace Tesses::Framework::Streams;
|
||||
using namespace Tesses::Framework::Http;
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if(argc < 3)
|
||||
{
|
||||
printf("USAGE: %s <url> <path>\n",argv[0]);
|
||||
printf("USAGE: %s <unixSocket> <url> <path>\n",argv[0]);
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 3) {
|
||||
printf("USAGE: %s <url> <path>\n", argv[0]);
|
||||
printf("USAGE: %s <unixSocket> <url> <path>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
if(argc >= 4)
|
||||
{
|
||||
if (argc >= 4) {
|
||||
std::string unixSocket = argv[1];
|
||||
std::string url = argv[2];
|
||||
std::string path = argv[3];
|
||||
Tesses::Framework::Http::DownloadUnixSocketToFileSimple(unixSocket,url,path);
|
||||
}
|
||||
else {
|
||||
std::string path = argv[3];
|
||||
Tesses::Framework::Http::DownloadUnixSocketToFileSimple(unixSocket, url,
|
||||
path);
|
||||
} else {
|
||||
std::string path = argv[2];
|
||||
Tesses::Framework::Http::DownloadToFileSimple(argv[1],path);
|
||||
Tesses::Framework::Http::DownloadToFileSimple(argv[1], path);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -6,121 +6,106 @@ using namespace Tesses::Framework::Streams;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
using namespace Tesses::Framework::Threading;
|
||||
|
||||
void print_help(const char* name)
|
||||
{
|
||||
printf("Tesses FileServer\nUSAGE: %s [OPTIONS] <dir>\n",name);
|
||||
printf("OPTIONS:\n-p PORT, --port PORT: Change port from 9852\n-l, --listing: Enable listing\n-s, --spa: Enable SPA mode (send \"/\" body instead of not found)\n-c, --cgi-bin: Enable cgi (common gateway interface) support (specify a folder like /cgi-bin)\n-a, --cgi-admin: cgi admin email\n-w, --cgi-working: working directory for cgi scripts\n-h, --help: This Screen\n");
|
||||
void print_help(const char *name) {
|
||||
printf("Tesses FileServer\nUSAGE: %s [OPTIONS] <dir>\n", name);
|
||||
printf("OPTIONS:\n-p PORT, --port PORT: Change port from 9852\n-l, "
|
||||
"--listing: Enable listing\n-s, --spa: Enable SPA mode (send \"/\" "
|
||||
"body instead of not found)\n-c, --cgi-bin: Enable cgi (common "
|
||||
"gateway interface) support (specify a folder like /cgi-bin)\n-a, "
|
||||
"--cgi-admin: cgi admin email\n-w, --cgi-working: working directory "
|
||||
"for cgi scripts\n-h, --help: This Screen\n");
|
||||
exit(1);
|
||||
}
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
try {
|
||||
|
||||
TF_InitWithConsole();
|
||||
TF_LOG("INIT");
|
||||
const char* directory = "wwwroot";
|
||||
bool spa=false;
|
||||
bool allowListing = false;
|
||||
std::optional<std::string> cgi_bin;
|
||||
std::optional<std::string> cgi_admin;
|
||||
std::optional<Tesses::Framework::Filesystem::VFSPath> cgi_workdir;
|
||||
uint16_t port = 9852L;
|
||||
|
||||
for(int i = 1; i < argc; i++)
|
||||
{
|
||||
if(strcmp(argv[i],"--help") == 0 || strcmp(argv[i],"-h") == 0)
|
||||
{
|
||||
print_help(argv[0]);
|
||||
}
|
||||
else if(strcmp(argv[i], "-c") == 0 || strcmp(argv[i],"--cgi-bin") == 0)
|
||||
{
|
||||
if(i+1>=argc)
|
||||
{
|
||||
printf("ERROR: Not enough arguments for cgi-bin\n");
|
||||
print_help(argv[0]);
|
||||
}
|
||||
else {
|
||||
printf("CGI is enabled\n");
|
||||
cgi_bin = argv[++i];
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[i], "-a") == 0 || strcmp(argv[i],"--cgi-admin") == 0)
|
||||
{
|
||||
if(i+1>=argc)
|
||||
{
|
||||
printf("ERROR: Not enough arguments for cgi-admin\n");
|
||||
print_help(argv[0]);
|
||||
}
|
||||
else {
|
||||
cgi_admin = argv[++i];
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[i], "-w") == 0 || strcmp(argv[i],"--cgi-working") == 0)
|
||||
{
|
||||
if(i+1>=argc)
|
||||
{
|
||||
printf("ERROR: Not enough arguments for cgi-working\n");
|
||||
print_help(argv[0]);
|
||||
}
|
||||
else {
|
||||
cgi_workdir = (Tesses::Framework::Filesystem::VFSPath)argv[++i];
|
||||
}
|
||||
}
|
||||
|
||||
else if(strcmp(argv[i], "-l") == 0 || strcmp(argv[i], "--listing") == 0)
|
||||
{
|
||||
allowListing = true;
|
||||
}
|
||||
else if(strcmp(argv[i],"-s") == 0 || strcmp(argv[i],"--spa") == 0)
|
||||
{
|
||||
spa=true;
|
||||
}
|
||||
else if(strcmp(argv[i],"-p") == 0 || strcmp(argv[i],"--port") == 0)
|
||||
{
|
||||
if(i+1>=argc)
|
||||
{
|
||||
printf("ERROR: Not enough arguments for PORT\n");
|
||||
print_help(argv[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
TF_InitWithConsole();
|
||||
TF_LOG("INIT");
|
||||
const char *directory = "wwwroot";
|
||||
bool spa = false;
|
||||
bool allowListing = false;
|
||||
std::optional<std::string> cgi_bin;
|
||||
std::optional<std::string> cgi_admin;
|
||||
std::optional<Tesses::Framework::Filesystem::VFSPath> cgi_workdir;
|
||||
uint16_t port = 9852L;
|
||||
|
||||
port = (uint16_t)std::stoul(argv[++i]);
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) {
|
||||
print_help(argv[0]);
|
||||
} else if (strcmp(argv[i], "-c") == 0 ||
|
||||
strcmp(argv[i], "--cgi-bin") == 0) {
|
||||
if (i + 1 >= argc) {
|
||||
printf("ERROR: Not enough arguments for cgi-bin\n");
|
||||
print_help(argv[0]);
|
||||
} else {
|
||||
printf("CGI is enabled\n");
|
||||
cgi_bin = argv[++i];
|
||||
}
|
||||
} else if (strcmp(argv[i], "-a") == 0 ||
|
||||
strcmp(argv[i], "--cgi-admin") == 0) {
|
||||
if (i + 1 >= argc) {
|
||||
printf("ERROR: Not enough arguments for cgi-admin\n");
|
||||
print_help(argv[0]);
|
||||
} else {
|
||||
cgi_admin = argv[++i];
|
||||
}
|
||||
} else if (strcmp(argv[i], "-w") == 0 ||
|
||||
strcmp(argv[i], "--cgi-working") == 0) {
|
||||
if (i + 1 >= argc) {
|
||||
printf("ERROR: Not enough arguments for cgi-working\n");
|
||||
print_help(argv[0]);
|
||||
} else {
|
||||
cgi_workdir =
|
||||
(Tesses::Framework::Filesystem::VFSPath)argv[++i];
|
||||
}
|
||||
}
|
||||
|
||||
else if (strcmp(argv[i], "-l") == 0 ||
|
||||
strcmp(argv[i], "--listing") == 0) {
|
||||
allowListing = true;
|
||||
} else if (strcmp(argv[i], "-s") == 0 ||
|
||||
strcmp(argv[i], "--spa") == 0) {
|
||||
spa = true;
|
||||
} else if (strcmp(argv[i], "-p") == 0 ||
|
||||
strcmp(argv[i], "--port") == 0) {
|
||||
if (i + 1 >= argc) {
|
||||
printf("ERROR: Not enough arguments for PORT\n");
|
||||
print_help(argv[0]);
|
||||
} else {
|
||||
|
||||
port = (uint16_t)std::stoul(argv[++i]);
|
||||
}
|
||||
} else {
|
||||
directory = argv[i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
directory = argv[i];
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "In folder: " << std::filesystem::absolute(directory).string() << std::endl;
|
||||
std::shared_ptr<IHttpServer> http;
|
||||
|
||||
auto fs = std::make_shared<FileServer>(directory,allowListing, spa);
|
||||
if(cgi_bin)
|
||||
{
|
||||
Tesses::Framework::Filesystem::VFSPath dir = *cgi_bin;
|
||||
dir.relative = true;
|
||||
auto svr = std::make_shared<MountableServer>(fs);
|
||||
auto cgi = std::make_shared<CGIServer>(std::filesystem::absolute(directory).string() / dir);
|
||||
cgi->adminEmail = cgi_admin;
|
||||
cgi->workingDirectory = cgi_workdir;
|
||||
svr->Mount(*cgi_bin, cgi);
|
||||
http = svr;
|
||||
}
|
||||
else {
|
||||
http = fs;
|
||||
}
|
||||
|
||||
HttpServer server(port,http);
|
||||
server.StartAccepting();
|
||||
TF_RunEventLoop();
|
||||
std::cout << "Closing server" << std::endl;
|
||||
TF_Quit();
|
||||
}catch(std::exception& ex)
|
||||
{
|
||||
TF_LOG(ex.what());
|
||||
}
|
||||
std::cout << "In folder: "
|
||||
<< std::filesystem::absolute(directory).string() << std::endl;
|
||||
std::shared_ptr<IHttpServer> http;
|
||||
|
||||
auto fs = std::make_shared<FileServer>(directory, allowListing, spa);
|
||||
if (cgi_bin) {
|
||||
Tesses::Framework::Filesystem::VFSPath dir = *cgi_bin;
|
||||
dir.relative = true;
|
||||
auto svr = std::make_shared<MountableServer>(fs);
|
||||
auto cgi = std::make_shared<CGIServer>(
|
||||
std::filesystem::absolute(directory).string() / dir);
|
||||
cgi->adminEmail = cgi_admin;
|
||||
cgi->workingDirectory = cgi_workdir;
|
||||
svr->Mount(*cgi_bin, cgi);
|
||||
http = svr;
|
||||
} else {
|
||||
http = fs;
|
||||
}
|
||||
|
||||
HttpServer server(port, http);
|
||||
server.StartAccepting();
|
||||
TF_RunEventLoop();
|
||||
std::cout << "Closing server" << std::endl;
|
||||
TF_Quit();
|
||||
} catch (std::exception &ex) {
|
||||
TF_LOG(ex.what());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2,44 +2,33 @@
|
||||
using namespace Tesses::Framework::Streams;
|
||||
using namespace Tesses::Framework::Serialization::Json;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest)
|
||||
{
|
||||
if(dest == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdout,false,"w");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(dest,"w");
|
||||
if(!strm->CanWrite())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
|
||||
if (dest == "-") {
|
||||
return std::make_shared<FileStream>(stdout, false, "w");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(dest, "w");
|
||||
if (!strm->CanWrite()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src)
|
||||
{
|
||||
if(src == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdin,false,"r");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(src,"r");
|
||||
if(!strm->CanRead())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src) {
|
||||
if (src == "-") {
|
||||
return std::make_shared<FileStream>(stdin, false, "r");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(src, "r");
|
||||
if (!strm->CanRead()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if(argc < 3)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 3) {
|
||||
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
|
||||
std::cout << "SRC: json file or - for stdin to convert to json doc" << std::endl;
|
||||
std::cout << "SRC: json file or - for stdin to convert to json doc"
|
||||
<< std::endl;
|
||||
std::cout << "DEST: json doc file or - for stdout" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -47,14 +36,12 @@ int main(int argc, char** argv)
|
||||
|
||||
auto dest = OpenWrite(argv[2]);
|
||||
|
||||
if(src == nullptr)
|
||||
{
|
||||
|
||||
if (src == nullptr) {
|
||||
|
||||
std::cerr << "ERROR: Input could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
if(dest == nullptr)
|
||||
{
|
||||
if (dest == nullptr) {
|
||||
std::cerr << "ERROR: Output could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
@@ -68,6 +55,5 @@ int main(int argc, char** argv)
|
||||
TryGetJToken(doc, docLs);
|
||||
writer.WriteLine(Json::DocEncode(docLs));
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2,44 +2,33 @@
|
||||
using namespace Tesses::Framework::Streams;
|
||||
using namespace Tesses::Framework::Serialization::Json;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest)
|
||||
{
|
||||
if(dest == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdout,false,"w");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(dest,"w");
|
||||
if(!strm->CanWrite())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
|
||||
if (dest == "-") {
|
||||
return std::make_shared<FileStream>(stdout, false, "w");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(dest, "w");
|
||||
if (!strm->CanWrite()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src)
|
||||
{
|
||||
if(src == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdin,false,"r");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(src,"r");
|
||||
if(!strm->CanRead())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src) {
|
||||
if (src == "-") {
|
||||
return std::make_shared<FileStream>(stdin, false, "r");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(src, "r");
|
||||
if (!strm->CanRead()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if(argc < 3)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 3) {
|
||||
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
|
||||
std::cout << "SRC: json file or - for stdin to make pretty" << std::endl;
|
||||
std::cout << "SRC: json file or - for stdin to make pretty"
|
||||
<< std::endl;
|
||||
std::cout << "DEST: prettied file or - for stdout" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -47,14 +36,12 @@ int main(int argc, char** argv)
|
||||
|
||||
auto dest = OpenWrite(argv[2]);
|
||||
|
||||
if(src == nullptr)
|
||||
{
|
||||
|
||||
if (src == nullptr) {
|
||||
|
||||
std::cerr << "ERROR: Input could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
if(dest == nullptr)
|
||||
{
|
||||
if (dest == nullptr) {
|
||||
std::cerr << "ERROR: Output could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
@@ -65,6 +52,5 @@ int main(int argc, char** argv)
|
||||
auto str = reader.ReadToEnd();
|
||||
writer.WriteLine(Json::Encode(Json::Decode(str)));
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2,44 +2,33 @@
|
||||
using namespace Tesses::Framework::Streams;
|
||||
using namespace Tesses::Framework::Serialization::Json;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest)
|
||||
{
|
||||
if(dest == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdout,false,"w");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(dest,"w");
|
||||
if(!strm->CanWrite())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenWrite(std::string dest) {
|
||||
if (dest == "-") {
|
||||
return std::make_shared<FileStream>(stdout, false, "w");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(dest, "w");
|
||||
if (!strm->CanWrite()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src)
|
||||
{
|
||||
if(src == "-")
|
||||
{
|
||||
return std::make_shared<FileStream>(stdin,false,"r");
|
||||
}
|
||||
else
|
||||
{
|
||||
auto strm = std::make_shared<FileStream>(src,"r");
|
||||
if(!strm->CanRead())
|
||||
{
|
||||
std::shared_ptr<FileStream> OpenRead(std::string src) {
|
||||
if (src == "-") {
|
||||
return std::make_shared<FileStream>(stdin, false, "r");
|
||||
} else {
|
||||
auto strm = std::make_shared<FileStream>(src, "r");
|
||||
if (!strm->CanRead()) {
|
||||
return nullptr;
|
||||
}
|
||||
return strm;
|
||||
}
|
||||
}
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if(argc < 3)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 3) {
|
||||
std::cout << "USAGE: " << argv[0] << " SRC DEST" << std::endl;
|
||||
std::cout << "SRC: json file or - for stdin to make unpretty" << std::endl;
|
||||
std::cout << "SRC: json file or - for stdin to make unpretty"
|
||||
<< std::endl;
|
||||
std::cout << "DEST: unprettied file or - for stdout" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -47,14 +36,12 @@ int main(int argc, char** argv)
|
||||
|
||||
auto dest = OpenWrite(argv[2]);
|
||||
|
||||
if(src == nullptr)
|
||||
{
|
||||
if (src == nullptr) {
|
||||
std::cerr << "ERROR: Input could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
if(dest == nullptr)
|
||||
{
|
||||
|
||||
if (dest == nullptr) {
|
||||
|
||||
std::cerr << "ERROR: Output could not be read" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
@@ -63,8 +50,7 @@ int main(int argc, char** argv)
|
||||
StreamWriter writer(dest);
|
||||
|
||||
auto str = reader.ReadToEnd();
|
||||
writer.WriteLine(Json::Encode(Json::Decode(str),false));
|
||||
|
||||
writer.WriteLine(Json::Encode(Json::Decode(str), false));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,9 +1,7 @@
|
||||
#include "TessesFramework/TessesFramework.hpp"
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if(argc < 2)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
if (argc < 2) {
|
||||
|
||||
std::cout << "USAGE: " << argv[0] << " times" << std::endl;
|
||||
std::cout << "USAGE: " << argv[0] << " times max" << std::endl;
|
||||
@@ -11,25 +9,19 @@ int main(int argc, char** argv)
|
||||
return 0;
|
||||
}
|
||||
Tesses::Framework::Random random;
|
||||
int times=std::atoi(argv[1]);
|
||||
if(argc > 2)
|
||||
{
|
||||
int times = std::atoi(argv[1]);
|
||||
if (argc > 2) {
|
||||
int32_t min = 0;
|
||||
int32_t max = std::stoi(argv[2]);
|
||||
if(argc > 3)
|
||||
{
|
||||
if (argc > 3) {
|
||||
min = max;
|
||||
max = std::stoi(argv[3]);
|
||||
|
||||
}
|
||||
for(int i = 0; i < times; i++)
|
||||
{
|
||||
std::cout << random.Next(min,max) << std::endl;
|
||||
for (int i = 0; i < times; i++) {
|
||||
std::cout << random.Next(min, max) << std::endl;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for(int i = 0; i < times; i++)
|
||||
{
|
||||
} else {
|
||||
for (int i = 0; i < times; i++) {
|
||||
std::cout << random.Next() << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
138
apps/tshell.cpp
138
apps/tshell.cpp
@@ -1,124 +1,110 @@
|
||||
#include "TessesFramework/TessesFramework.hpp"
|
||||
#include "TessesFramework/Platform/Process.hpp"
|
||||
#include "TessesFramework/TessesFramework.hpp"
|
||||
using namespace Tesses::Framework;
|
||||
using namespace Tesses::Framework::Platform;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
using namespace Tesses::Framework::Filesystem;
|
||||
|
||||
void split_command(std::string cmd, std::vector<std::string>& args)
|
||||
{
|
||||
bool inStr=false;
|
||||
std::string cur={};
|
||||
auto flush=[&]()->void {
|
||||
if(cur.empty()) return;
|
||||
void split_command(std::string cmd, std::vector<std::string> &args) {
|
||||
bool inStr = false;
|
||||
std::string cur = {};
|
||||
auto flush = [&]() -> void {
|
||||
if (cur.empty())
|
||||
return;
|
||||
args.push_back(cur);
|
||||
cur={};
|
||||
cur = {};
|
||||
};
|
||||
for(size_t i = 0; i < cmd.size(); i++)
|
||||
{
|
||||
if(inStr)
|
||||
{
|
||||
if(cmd[i] == '\"') inStr=false;
|
||||
else if(cmd[i] == '\\')
|
||||
{
|
||||
for (size_t i = 0; i < cmd.size(); i++) {
|
||||
if (inStr) {
|
||||
if (cmd[i] == '\"')
|
||||
inStr = false;
|
||||
else if (cmd[i] == '\\') {
|
||||
i++;
|
||||
if(i < cmd.size())
|
||||
{
|
||||
if (i < cmd.size()) {
|
||||
cmd.push_back(cmd[i]);
|
||||
}
|
||||
}
|
||||
else cur.push_back(cmd[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(cmd[i] == ' ') flush();
|
||||
else if(cmd[i] == '\"') {
|
||||
inStr=true;
|
||||
}
|
||||
else {
|
||||
} else
|
||||
cur.push_back(cmd[i]);
|
||||
} else {
|
||||
if (cmd[i] == ' ')
|
||||
flush();
|
||||
else if (cmd[i] == '\"') {
|
||||
inStr = true;
|
||||
} else {
|
||||
cur.push_back(cmd[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
flush();
|
||||
}
|
||||
|
||||
int main(int argc,char** argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
TF_Init();
|
||||
|
||||
|
||||
|
||||
while(true)
|
||||
{
|
||||
std::cout << VFSPath::GetAbsoluteCurrentDirectory().ToString() << "$ ";
|
||||
|
||||
while (true) {
|
||||
std::cout << VFSPath::GetAbsoluteCurrentDirectory().ToString() << "$ ";
|
||||
|
||||
std::string text;
|
||||
StdIn().ReadLine(text);
|
||||
std::vector<std::string> args;
|
||||
split_command(text,args);
|
||||
if(args.empty()) continue;
|
||||
if(args[0] == "exit") break;
|
||||
else if(args[0] == "echo") { if(args.size() > 1) std::cout << args[1] << std::endl;}
|
||||
else if(args[0] == "cd") {
|
||||
if(args.size() < 2)
|
||||
{
|
||||
VFSPath::SetAbsoluteCurrentDirectory(Environment::SpecialFolders::GetHomeFolder());
|
||||
}
|
||||
else {
|
||||
split_command(text, args);
|
||||
if (args.empty())
|
||||
continue;
|
||||
if (args[0] == "exit")
|
||||
break;
|
||||
else if (args[0] == "echo") {
|
||||
if (args.size() > 1)
|
||||
std::cout << args[1] << std::endl;
|
||||
} else if (args[0] == "cd") {
|
||||
if (args.size() < 2) {
|
||||
VFSPath::SetAbsoluteCurrentDirectory(
|
||||
Environment::SpecialFolders::GetHomeFolder());
|
||||
} else {
|
||||
VFSPath::SetAbsoluteCurrentDirectory(args[1]);
|
||||
}
|
||||
}
|
||||
else if(args[0] == "printargs")
|
||||
{
|
||||
for(size_t i = 1; i < args.size(); i++)
|
||||
{
|
||||
std::cout << "\"" << Http::HttpUtils::Replace(args[i],"\"","\\\"") << "\"" << std::endl;
|
||||
} else if (args[0] == "printargs") {
|
||||
for (size_t i = 1; i < args.size(); i++) {
|
||||
std::cout << "\""
|
||||
<< Http::HttpUtils::Replace(args[i], "\"", "\\\"")
|
||||
<< "\"" << std::endl;
|
||||
}
|
||||
}
|
||||
else if (args[0] == "sigtermtest")
|
||||
{
|
||||
if (args.size() < 2) continue;
|
||||
} else if (args[0] == "sigtermtest") {
|
||||
if (args.size() < 2)
|
||||
continue;
|
||||
std::vector<std::string> args2(args.begin() + 1, args.end());
|
||||
|
||||
auto path = Environment::GetRealExecutablePath(args2[0]);
|
||||
Platform::Process p(path.ToString(), args2);
|
||||
if (p.Start())
|
||||
{
|
||||
if (p.Start()) {
|
||||
std::cout << "Press enter to sigterm" << std::endl;
|
||||
StdIn().ReadLine();
|
||||
p.Kill(SIGTERM);
|
||||
}
|
||||
}
|
||||
else if(args[0] == "rstdi")
|
||||
{
|
||||
if(args.size()<3) continue;
|
||||
std::vector<std::string> args2(args.begin()+2,args.end());
|
||||
auto f = LocalFS->OpenFile(args[1],"rb");
|
||||
if(f != nullptr)
|
||||
{
|
||||
} else if (args[0] == "rstdi") {
|
||||
if (args.size() < 3)
|
||||
continue;
|
||||
std::vector<std::string> args2(args.begin() + 2, args.end());
|
||||
auto f = LocalFS->OpenFile(args[1], "rb");
|
||||
if (f != nullptr) {
|
||||
auto path = Environment::GetRealExecutablePath(args2[0]);
|
||||
Platform::Process p(path.ToString(),args2);
|
||||
p.redirectStdIn=true;
|
||||
if(p.Start())
|
||||
{
|
||||
Platform::Process p(path.ToString(), args2);
|
||||
p.redirectStdIn = true;
|
||||
if (p.Start()) {
|
||||
auto strm = p.GetStdinStream();
|
||||
f->CopyTo(strm);
|
||||
|
||||
|
||||
p.CloseStdInNow();
|
||||
p.WaitForExit();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
auto path = Environment::GetRealExecutablePath(args[0]);
|
||||
Platform::Process p(path.ToString(),args);
|
||||
Platform::Process p(path.ToString(), args);
|
||||
if (p.Start())
|
||||
p.WaitForExit();
|
||||
p.WaitForExit();
|
||||
else
|
||||
std::cout << "Failed To Run Process: " << path.ToString() << std::endl;
|
||||
std::cout << "Failed To Run Process: " << path.ToString()
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,15 +3,12 @@
|
||||
using namespace Tesses::Framework;
|
||||
using namespace Tesses::Framework::Date;
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
TF_Init();
|
||||
DateTime dt=DateTime::Now();
|
||||
//dt = dt.ToLocal();
|
||||
if(argc > 1)
|
||||
{
|
||||
if(strcmp(argv[1],"--help") == 0)
|
||||
{
|
||||
DateTime dt = DateTime::Now();
|
||||
// dt = dt.ToLocal();
|
||||
if (argc > 1) {
|
||||
if (strcmp(argv[1], "--help") == 0) {
|
||||
/*
|
||||
case 'r':
|
||||
{
|
||||
@@ -34,15 +31,15 @@ int main(int argc, char** argv)
|
||||
break;
|
||||
case 'T':
|
||||
{
|
||||
|
||||
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(hour),2,'0'));
|
||||
text.push_back(':');
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(minute),2,'0'));
|
||||
text.push_back(':');
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(second),2,'0'));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
case 'u':
|
||||
{
|
||||
@@ -53,7 +50,7 @@ int main(int argc, char** argv)
|
||||
break;
|
||||
case 'w':
|
||||
{
|
||||
|
||||
|
||||
text.append(std::to_string(weekday));
|
||||
}
|
||||
break;
|
||||
@@ -72,14 +69,13 @@ int main(int argc, char** argv)
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(second),2,'0'));
|
||||
text.push_back(' ');
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(year),4,'0'));
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
break;
|
||||
case 'C':
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(year / 100),2,'0'));
|
||||
break;
|
||||
case 'Y':
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(year
|
||||
/ 100),2,'0')); break; case 'Y':
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(year),4,'0'));
|
||||
break;
|
||||
case 'p':
|
||||
@@ -90,7 +86,7 @@ int main(int argc, char** argv)
|
||||
auto hours = hour % 12;
|
||||
if(hours == 0) hours=12;
|
||||
text.append(Http::HttpUtils::LeftPad(std::to_string(hours),2,'0'));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
case 'b':
|
||||
@@ -110,24 +106,37 @@ int main(int argc, char** argv)
|
||||
break;
|
||||
*/
|
||||
std::cout << argv[0] << " <fmt>" << std::endl;
|
||||
std::cout << "The fmt is for DateTime::ToString(fmt) just like strftime but just these are supported:" << std::endl;
|
||||
std::cout << "%a: weekday short eg " << dt.ToString("%a") << std::endl;
|
||||
std::cout << "%A: weekday long eg " << dt.ToString("%A") << std::endl;
|
||||
std::cout << "%S: seconds with leading zeros eg " << dt.ToString("%S") << std::endl;
|
||||
std::cout << "%m: month with leading zeros eg " << dt.ToString("%m") << std::endl;
|
||||
std::cout << "%d: day with leading zeros eg " << dt.ToString("%d") << std::endl;
|
||||
std::cout << "%e: day with leading spaces eg " << dt.ToString("%e") << std::endl;
|
||||
std::cout << "%M: minute with leading zeros eg " << dt.ToString("%M") << std::endl;
|
||||
std::cout << "%H: 24 hour with leading zeros eg " << dt.ToString("%H") << std::endl;
|
||||
std::cout << "%F: %Y-%m-%d like this " << dt.ToString("%F") << std::endl;
|
||||
std::cout << "%D: %m/%d/%y like this " << dt.ToString("%D") << std::endl;
|
||||
std::cout << "%y: year two digits eg " << dt.ToString("%y") << std::endl;
|
||||
std::cout << "%Y: year four digits eg " << dt.ToString("%Y") << std::endl;
|
||||
std::cout << "The fmt is for DateTime::ToString(fmt) just like "
|
||||
"strftime but just these are supported:"
|
||||
<< std::endl;
|
||||
std::cout << "%a: weekday short eg " << dt.ToString("%a")
|
||||
<< std::endl;
|
||||
std::cout << "%A: weekday long eg " << dt.ToString("%A")
|
||||
<< std::endl;
|
||||
std::cout << "%S: seconds with leading zeros eg "
|
||||
<< dt.ToString("%S") << std::endl;
|
||||
std::cout << "%m: month with leading zeros eg " << dt.ToString("%m")
|
||||
<< std::endl;
|
||||
std::cout << "%d: day with leading zeros eg " << dt.ToString("%d")
|
||||
<< std::endl;
|
||||
std::cout << "%e: day with leading spaces eg " << dt.ToString("%e")
|
||||
<< std::endl;
|
||||
std::cout << "%M: minute with leading zeros eg "
|
||||
<< dt.ToString("%M") << std::endl;
|
||||
std::cout << "%H: 24 hour with leading zeros eg "
|
||||
<< dt.ToString("%H") << std::endl;
|
||||
std::cout << "%F: %Y-%m-%d like this " << dt.ToString("%F")
|
||||
<< std::endl;
|
||||
std::cout << "%D: %m/%d/%y like this " << dt.ToString("%D")
|
||||
<< std::endl;
|
||||
std::cout << "%y: year two digits eg " << dt.ToString("%y")
|
||||
<< std::endl;
|
||||
std::cout << "%Y: year four digits eg " << dt.ToString("%Y")
|
||||
<< std::endl;
|
||||
return 1;
|
||||
}
|
||||
std::cout << dt.ToString(argv[1]) << std::endl;
|
||||
}
|
||||
else
|
||||
std::cout << dt.ToString() << std::endl;
|
||||
} else
|
||||
std::cout << dt.ToString() << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6,61 +6,67 @@ using namespace Tesses::Framework::Filesystem;
|
||||
using namespace Tesses::Framework::Serialization::Bencode;
|
||||
using namespace Tesses::Framework::TextStreams;
|
||||
using namespace Tesses::Framework::BitTorrent;
|
||||
void usage(Args& args)
|
||||
{
|
||||
std::cout << "USAGE: " << args.filename << " [options] torrent_contents torrent_file.torrent" << std::endl << std::endl;
|
||||
void usage(Args &args) {
|
||||
std::cout << "USAGE: " << args.filename
|
||||
<< " [options] torrent_contents torrent_file.torrent" << std::endl
|
||||
<< std::endl;
|
||||
std::cout << "OPTIONS:" << std::endl;
|
||||
std::cout << "tracker: torrent tracker url (require at least one)" << std::endl;
|
||||
std::cout << "tracker: torrent tracker url (require at least one)"
|
||||
<< std::endl;
|
||||
std::cout << "webseed: url for web seeding" << std::endl;
|
||||
std::cout << "comment: set the comment" << std::endl;
|
||||
std::cout << "created_by: set the created by field, defaults to TessesFrameworkTorrent" << std::endl;
|
||||
std::cout << "piece_length: set the piece length, defaults to " + std::to_string(DEFAULT_PIECE_LENGTH) << std::endl << std::endl;
|
||||
std::cout << "created_by: set the created by field, defaults to "
|
||||
"TessesFrameworkTorrent"
|
||||
<< std::endl;
|
||||
std::cout << "piece_length: set the piece length, defaults to " +
|
||||
std::to_string(DEFAULT_PIECE_LENGTH)
|
||||
<< std::endl
|
||||
<< std::endl;
|
||||
std::cout << "FLAGS:" << std::endl;
|
||||
std::cout << "help: bring this help message up" << std::endl;
|
||||
std::cout << "private: enable private tracker flag" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
TF_Init();
|
||||
std::vector<BeString> webseeds;
|
||||
std::vector<BeString> trackers;
|
||||
bool isPrivate=false;
|
||||
bool isPrivate = false;
|
||||
int64_t pieceLength = DEFAULT_PIECE_LENGTH;
|
||||
std::string comment="";
|
||||
std::string comment = "";
|
||||
std::string created_by = "TessesFrameworkTorrent";
|
||||
|
||||
Args args(argc, argv);
|
||||
if(args.positional.size() < 2)
|
||||
if (args.positional.size() < 2)
|
||||
usage(args);
|
||||
|
||||
for(auto& opt : args.options)
|
||||
{
|
||||
if(opt.first == "tracker")
|
||||
for (auto &opt : args.options) {
|
||||
if (opt.first == "tracker")
|
||||
trackers.push_back(opt.second);
|
||||
else if(opt.first == "webseed")
|
||||
else if (opt.first == "webseed")
|
||||
webseeds.push_back(opt.second);
|
||||
else if(opt.first == "comment")
|
||||
else if (opt.first == "comment")
|
||||
comment = opt.second;
|
||||
else if(opt.first == "created_by")
|
||||
else if (opt.first == "created_by")
|
||||
created_by = opt.second;
|
||||
else if(opt.first == "piece_length")
|
||||
else if (opt.first == "piece_length")
|
||||
pieceLength = std::stoll(opt.second);
|
||||
}
|
||||
|
||||
for(auto& flag : args.flags)
|
||||
{
|
||||
if(flag == "help")
|
||||
for (auto &flag : args.flags) {
|
||||
if (flag == "help")
|
||||
usage(args);
|
||||
if(flag == "private")
|
||||
if (flag == "private")
|
||||
isPrivate = true;
|
||||
}
|
||||
|
||||
if(trackers.empty())
|
||||
|
||||
if (trackers.empty())
|
||||
usage(args);
|
||||
{
|
||||
auto torrent_file_stream = LocalFS->OpenFile(args.positional[1],"wb");
|
||||
TorrentFile::CreateTorrent(torrent_file_stream,trackers,webseeds,LocalFS, args.positional[0], isPrivate, pieceLength, comment, created_by);
|
||||
auto torrent_file_stream = LocalFS->OpenFile(args.positional[1], "wb");
|
||||
TorrentFile::CreateTorrent(torrent_file_stream, trackers, webseeds,
|
||||
LocalFS, args.positional[0], isPrivate,
|
||||
pieceLength, comment, created_by);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,9 +1,8 @@
|
||||
#include "TessesFramework/Uuid.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
//e794499c
|
||||
int main(int argc, char **argv) {
|
||||
// e794499c
|
||||
using namespace Tesses::Framework;
|
||||
|
||||
Uuid uuid = Uuid::Generate();
|
||||
@@ -20,5 +19,7 @@ int main(int argc, char** argv)
|
||||
uuid.node[4] = 0xb4;
|
||||
uuid.node[5] = 0xac;*/
|
||||
|
||||
std::cout << uuid.ToString(Tesses::Framework::UuidStringifyConfig::LowercaseNoCurly) << std::endl;
|
||||
std::cout << uuid.ToString(
|
||||
Tesses::Framework::UuidStringifyConfig::LowercaseNoCurly)
|
||||
<< std::endl;
|
||||
}
|
||||
@@ -4,18 +4,16 @@ using namespace Tesses::Framework;
|
||||
using namespace Tesses::Framework::Filesystem;
|
||||
using namespace Tesses::Framework::Filesystem::Literals;
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
TF_Init();
|
||||
if(argc<2)
|
||||
{
|
||||
if (argc < 2) {
|
||||
std::cout << "USAGE " << argv[0] << " <file|dir>" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto watcher=FSWatcher::Create(LocalFS,VFSPath{argv[1]});
|
||||
auto watcher = FSWatcher::Create(LocalFS, VFSPath{argv[1]});
|
||||
watcher->events = FSWatcherEventType::All;
|
||||
watcher->event = [](FSWatcherEvent& evt)->void{
|
||||
watcher->event = [](FSWatcherEvent &evt) -> void {
|
||||
std::cout << evt.ToString() << std::endl;
|
||||
};
|
||||
watcher->SetEnabled(true);
|
||||
|
||||
Reference in New Issue
Block a user