diff --git a/src/lib/arch/Arch.h b/src/lib/arch/Arch.h index 42a73c2e..c062d6f3 100644 --- a/src/lib/arch/Arch.h +++ b/src/lib/arch/Arch.h @@ -40,7 +40,6 @@ #if SYSAPI_WIN32 # include "arch/win32/ArchConsoleWindows.h" # include "arch/win32/ArchDaemonWindows.h" -# include "arch/win32/ArchFileWindows.h" # include "arch/win32/ArchLogWindows.h" # include "arch/win32/ArchMiscWindows.h" # include "arch/win32/ArchMultithreadWindows.h" @@ -54,7 +53,6 @@ #elif SYSAPI_UNIX # include "arch/unix/ArchConsoleUnix.h" # include "arch/unix/ArchDaemonUnix.h" -# include "arch/unix/ArchFileUnix.h" # include "arch/unix/ArchLogUnix.h" # if HAVE_PTHREAD # include "arch/unix/ArchMultithreadPosix.h" @@ -86,7 +84,6 @@ typically at the beginning of \c main(). */ class Arch : public ARCH_CONSOLE, public ARCH_DAEMON, - public ARCH_FILE, public ARCH_LOG, public ARCH_MULTITHREAD, public ARCH_NETWORK, diff --git a/src/lib/arch/IArchFile.h b/src/lib/arch/IArchFile.h deleted file mode 100644 index 88cb7792..00000000 --- a/src/lib/arch/IArchFile.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * barrier -- mouse and keyboard sharing utility - * Copyright (C) 2012-2016 Symless Ltd. - * Copyright (C) 2002 Chris Schoeneman - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * found in the file LICENSE that should have accompanied this file. - * - * This package is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include "common/IInterface.h" -#include "common/stdstring.h" -#include "base/String.h" - -//! Interface for architecture dependent file system operations -/*! -This interface defines the file system operations required by -barrier. Each architecture must implement this interface. -*/ -class IArchFile : public IInterface { -public: - //! @name manipulators - //@{ - - //! Extract base name - /*! - Find the base name in the given \c pathname. - */ - virtual const char* getBasename(const char* pathname) = 0; - - //! Concatenate path components - /*! - Concatenate pathname components with a directory separator - between them. This should not check if the resulting path - is longer than allowed by the system; we'll rely on the - system calls to tell us that. - */ - virtual std::string concatPath( - const std::string& prefix, - const std::string& suffix) = 0; -}; diff --git a/src/lib/arch/unix/ArchFileUnix.cpp b/src/lib/arch/unix/ArchFileUnix.cpp deleted file mode 100644 index 206f1f18..00000000 --- a/src/lib/arch/unix/ArchFileUnix.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * barrier -- mouse and keyboard sharing utility - * Copyright (C) 2012-2016 Symless Ltd. - * Copyright (C) 2002 Chris Schoeneman - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * found in the file LICENSE that should have accompanied this file. - * - * This package is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "arch/unix/ArchFileUnix.h" -#include "common/DataDirectories.h" - -#include -#include -#include -#include -#include - -// -// ArchFileUnix -// - -const char* -ArchFileUnix::getBasename(const char* pathname) -{ - if (pathname == NULL) { - return NULL; - } - - const char* basename = strrchr(pathname, '/'); - if (basename != NULL) { - return basename + 1; - } - else { - return pathname; - } -} - -std::string -ArchFileUnix::concatPath(const std::string& prefix, - const std::string& suffix) -{ - std::string path; - path.reserve(prefix.size() + 1 + suffix.size()); - path += prefix; - if (path.size() == 0 || path[path.size() - 1] != '/') { - path += '/'; - } - path += suffix; - return path; -} diff --git a/src/lib/arch/unix/ArchFileUnix.h b/src/lib/arch/unix/ArchFileUnix.h deleted file mode 100644 index b39f9827..00000000 --- a/src/lib/arch/unix/ArchFileUnix.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * barrier -- mouse and keyboard sharing utility - * Copyright (C) 2012-2016 Symless Ltd. - * Copyright (C) 2002 Chris Schoeneman - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * found in the file LICENSE that should have accompanied this file. - * - * This package is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include "arch/IArchFile.h" - -#define ARCH_FILE ArchFileUnix - -//! Unix implementation of IArchFile -class ArchFileUnix : public IArchFile { -public: - // IArchFile overrides - virtual const char* getBasename(const char* pathname); - virtual std::string concatPath(const std::string& prefix, - const std::string& suffix); -}; diff --git a/src/lib/arch/win32/ArchFileWindows.cpp b/src/lib/arch/win32/ArchFileWindows.cpp deleted file mode 100644 index 8f362551..00000000 --- a/src/lib/arch/win32/ArchFileWindows.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * barrier -- mouse and keyboard sharing utility - * Copyright (C) 2012-2016 Symless Ltd. - * Copyright (C) 2002 Chris Schoeneman - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * found in the file LICENSE that should have accompanied this file. - * - * This package is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "arch/win32/ArchFileWindows.h" -#include "common/DataDirectories.h" - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include - -// -// ArchFileWindows -// - -const char* -ArchFileWindows::getBasename(const char* pathname) -{ - if (pathname == NULL) { - return NULL; - } - - // check for last slash - const char* basename = strrchr(pathname, '/'); - if (basename != NULL) { - ++basename; - } - else { - basename = pathname; - } - - // check for last backslash - const char* basename2 = strrchr(pathname, '\\'); - if (basename2 != NULL && basename2 > basename) { - basename = basename2 + 1; - } - - return basename; -} - -std::string -ArchFileWindows::concatPath(const std::string& prefix, - const std::string& suffix) -{ - std::string path; - path.reserve(prefix.size() + 1 + suffix.size()); - path += prefix; - if (path.size() == 0 || - (path[path.size() - 1] != '\\' && - path[path.size() - 1] != '/')) { - path += '\\'; - } - path += suffix; - return path; -} diff --git a/src/lib/arch/win32/ArchFileWindows.h b/src/lib/arch/win32/ArchFileWindows.h deleted file mode 100644 index 2bfa316d..00000000 --- a/src/lib/arch/win32/ArchFileWindows.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * barrier -- mouse and keyboard sharing utility - * Copyright (C) 2012-2016 Symless Ltd. - * Copyright (C) 2002 Chris Schoeneman - * - * This package is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * found in the file LICENSE that should have accompanied this file. - * - * This package is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include "arch/IArchFile.h" - -#define ARCH_FILE ArchFileWindows - -//! Win32 implementation of IArchFile -class ArchFileWindows : public IArchFile { -public: - // IArchFile overrides - virtual const char* getBasename(const char* pathname); - virtual std::string concatPath(const std::string& prefix, - const std::string& suffix); -}; diff --git a/src/lib/barrier/ArgParser.cpp b/src/lib/barrier/ArgParser.cpp index 1ce918c7..df478ab9 100644 --- a/src/lib/barrier/ArgParser.cpp +++ b/src/lib/barrier/ArgParser.cpp @@ -24,6 +24,7 @@ #include "barrier/ArgsBase.h" #include "base/Log.h" #include "base/String.h" +#include "common/PathUtilities.h" #ifdef WINAPI_MSWINDOWS #include @@ -455,7 +456,7 @@ void ArgParser::updateCommonArgs(const char* const* argv) { argsBase().m_name = ARCH->getHostName(); - argsBase().m_pname = ARCH->getBasename(argv[0]); + argsBase().m_pname = PathUtilities::basename(argv[0]).c_str(); } bool diff --git a/src/lib/barrier/ClientApp.cpp b/src/lib/barrier/ClientApp.cpp index 87686f29..23c0ea36 100644 --- a/src/lib/barrier/ClientApp.cpp +++ b/src/lib/barrier/ClientApp.cpp @@ -40,10 +40,7 @@ #include "base/TMethodJob.h" #include "base/Log.h" #include "common/Version.h" - -#if SYSAPI_WIN32 -#include "arch/win32/ArchMiscWindows.h" -#endif +#include "common/PathUtilities.h" #if WINAPI_MSWINDOWS #include "platform/MSWindowsScreen.h" @@ -519,7 +516,7 @@ ClientApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc { // general initialization m_serverAddress = new NetworkAddress; - args().m_pname = ARCH->getBasename(argv[0]); + args().m_pname = PathUtilities::basename(argv[0]).c_str(); // install caller's output filter if (outputter != NULL) { diff --git a/src/lib/barrier/ServerApp.cpp b/src/lib/barrier/ServerApp.cpp index 240db855..c6e31a5d 100644 --- a/src/lib/barrier/ServerApp.cpp +++ b/src/lib/barrier/ServerApp.cpp @@ -40,6 +40,7 @@ #include "base/TMethodEventJob.h" #include "common/Version.h" #include "common/DataDirectories.h" +#include "common/PathUtilities.h" #if SYSAPI_WIN32 #include "arch/win32/ArchMiscWindows.h" @@ -143,8 +144,8 @@ ServerApp::help() << std::endl << "If no configuration file pathname is provided then the first of the" << std::endl << "following to load successfully sets the configuration:" << std::endl - << " $HOME/" << USR_CONFIG_NAME << std::endl - << " " << ARCH->concatPath(DataDirectories::systemconfig(), SYS_CONFIG_NAME) << std::endl; + << " " << PathUtilities::concat(DataDirectories::personal(), SYS_CONFIG_NAME) << std::endl + << " " << PathUtilities::concat(DataDirectories::systemconfig(), SYS_CONFIG_NAME) << std::endl; LOG((CLOG_PRINT "%s", buffer.str().c_str())); } @@ -185,7 +186,7 @@ ServerApp::loadConfig() String path = DataDirectories::personal(); if (!path.empty()) { // complete path - path = ARCH->concatPath(path, USR_CONFIG_NAME); + path = PathUtilities::concat(path, USR_CONFIG_NAME); // now try loading the user's configuration if (loadConfig(path)) { @@ -197,7 +198,7 @@ ServerApp::loadConfig() // try the system-wide config file path = DataDirectories::systemconfig(); if (!path.empty()) { - path = ARCH->concatPath(path, SYS_CONFIG_NAME); + path = PathUtilities::concat(path, SYS_CONFIG_NAME); if (loadConfig(path)) { loaded = true; args().m_configFile = path; @@ -780,7 +781,7 @@ ServerApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc // general initialization m_barrierAddress = new NetworkAddress; args().m_config = new Config(m_events); - args().m_pname = ARCH->getBasename(argv[0]); + args().m_pname = PathUtilities::basename(argv[0]).c_str(); // install caller's output filter if (outputter != NULL) { diff --git a/src/lib/common/DataDirectories.h b/src/lib/common/DataDirectories.h index ddb903e4..edc604a6 100644 --- a/src/lib/common/DataDirectories.h +++ b/src/lib/common/DataDirectories.h @@ -26,4 +26,3 @@ private: static std::string _global; static std::string _systemconfig; }; - diff --git a/src/lib/common/PathUtilities.cpp b/src/lib/common/PathUtilities.cpp new file mode 100644 index 00000000..9859e048 --- /dev/null +++ b/src/lib/common/PathUtilities.cpp @@ -0,0 +1,45 @@ +#include "PathUtilities.h" + +// keep the default platform delimiter as the first in the list +#ifdef _WIN32 +static const char *Delimiters = "\\/"; +#else +static const char *Delimiters = "/"; +#endif + +static const char DefaultDelimiter = Delimiters[0]; + +std::string PathUtilities::basename(const std::string& path) +{ + return path.substr(path.find_last_of(Delimiters) + 1); +} + +std::string PathUtilities::concat(const std::string& left, const std::string& right) +{ + // although npos is usually (-1) we can't count on that so handle it explicitly + auto leftEnd = left.find_last_not_of(Delimiters); + if (leftEnd == std::string::npos) + leftEnd = 0; + else + ++leftEnd; + auto rightStart = right.find_first_not_of(Delimiters, 0); + if (rightStart == std::string::npos) { + // l/r empty + if (left.size() == 0 && right.size() == 0) + return ""; + // r useless, l okay + if (leftEnd > 0) + return left.substr(0, leftEnd); + // both useless but one has a delim + return std::string(1, DefaultDelimiter); + } + if (leftEnd == 0) { + // r okay and not prefixed with delims, l empty + if (left.size() == 0 && rightStart == 0) + return right.substr(rightStart); + // r okay and prefixed with delims OR l full of delims + return DefaultDelimiter + right.substr(rightStart); + } + // normal concatenation + return left.substr(0, leftEnd) + DefaultDelimiter + right.substr(rightStart); +} diff --git a/src/lib/common/PathUtilities.h b/src/lib/common/PathUtilities.h new file mode 100644 index 00000000..993229b6 --- /dev/null +++ b/src/lib/common/PathUtilities.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +class PathUtilities +{ +public: + static std::string basename(const std::string& path); + static std::string concat(const std::string& left, const std::string& right); + +private: + // static class + PathUtilities() {} +};