2015-04-13 04:09:02 -05:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
|
2015-03-17 18:56:15 -05:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef INCLUDED_UTIL_HPP
|
|
|
|
#define INCLUDED_UTIL_HPP
|
|
|
|
|
2015-04-24 04:49:19 -05:00
|
|
|
#include <string>
|
2015-12-24 21:19:50 -06:00
|
|
|
#include <sstream>
|
2015-12-28 15:34:21 -06:00
|
|
|
#include <functional>
|
2016-01-21 08:28:05 -06:00
|
|
|
#include <memory>
|
2016-04-18 17:52:10 -05:00
|
|
|
#include <set>
|
2015-04-24 04:49:19 -05:00
|
|
|
|
2015-12-25 19:11:47 -06:00
|
|
|
#include <Poco/File.h>
|
|
|
|
#include <Poco/Path.h>
|
2016-02-16 15:25:51 -06:00
|
|
|
#include <Poco/Process.h>
|
2015-04-22 03:14:11 -05:00
|
|
|
#include <Poco/Net/WebSocket.h>
|
2016-04-18 17:52:10 -05:00
|
|
|
#include <Poco/RegularExpression.h>
|
2015-04-22 03:14:11 -05:00
|
|
|
|
2015-11-24 02:19:17 -06:00
|
|
|
#define LOK_USE_UNSTABLE_API
|
|
|
|
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
|
|
|
|
|
2016-04-14 19:12:43 -05:00
|
|
|
#include "Log.hpp"
|
|
|
|
|
2016-01-09 12:51:55 -06:00
|
|
|
/// Flag to stop pump loops.
|
|
|
|
extern volatile bool TerminationFlag;
|
|
|
|
|
2015-03-26 10:07:52 -05:00
|
|
|
namespace Util
|
2015-03-17 18:56:15 -05:00
|
|
|
{
|
2015-12-19 08:16:44 -06:00
|
|
|
namespace rng
|
|
|
|
{
|
2016-03-12 09:15:45 -06:00
|
|
|
void reseed();
|
|
|
|
unsigned getNext();
|
2015-12-19 08:16:44 -06:00
|
|
|
}
|
|
|
|
|
2015-12-27 21:47:39 -06:00
|
|
|
/// Encode an integral ID into a string, with padding support.
|
|
|
|
std::string encodeId(const unsigned number, const int padding = 5);
|
2016-01-09 14:46:08 -06:00
|
|
|
/// Decode an integral ID from a string.
|
|
|
|
unsigned decodeId(const std::string& str);
|
2015-12-27 21:47:39 -06:00
|
|
|
|
2016-01-06 21:47:01 -06:00
|
|
|
/// Creates a randomly name directory within path and returns the name.
|
|
|
|
std::string createRandomDir(const std::string& path);
|
|
|
|
|
2015-03-28 06:53:44 -05:00
|
|
|
bool windowingAvailable();
|
2015-04-24 04:49:47 -05:00
|
|
|
|
2015-04-10 04:39:12 -05:00
|
|
|
// Sadly, older libpng headers don't use const for the pixmap pointer parameter to
|
|
|
|
// png_write_row(), so can't use const here for pixmap.
|
2016-01-12 05:00:42 -06:00
|
|
|
bool encodeBufferToPNG(unsigned char* pixmap, int width, int height,
|
|
|
|
std::vector<char>& output, LibreOfficeKitTileMode mode);
|
|
|
|
bool encodeSubBufferToPNG(unsigned char* pixmap, int startX, int startY, int width, int height,
|
|
|
|
int bufferWidth, int bufferHeight,
|
|
|
|
std::vector<char>& output, LibreOfficeKitTileMode mode);
|
2015-04-22 03:14:11 -05:00
|
|
|
|
2015-12-25 19:11:47 -06:00
|
|
|
/// Safely remove a file or directory.
|
|
|
|
/// Supresses exception when the file is already removed.
|
|
|
|
/// This can happen when there is a race (unavoidable) or when
|
|
|
|
/// we don't care to check before we remove (when no race exists).
|
|
|
|
inline
|
|
|
|
void removeFile(const std::string& path, const bool recursive = false)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
Poco::File(path).remove(recursive);
|
|
|
|
}
|
|
|
|
catch (const std::exception&)
|
|
|
|
{
|
2015-12-28 17:24:29 -06:00
|
|
|
// Already removed or we don't care about failures.
|
2015-12-25 19:11:47 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inline
|
|
|
|
void removeFile(const Poco::Path& path, const bool recursive = false)
|
|
|
|
{
|
|
|
|
removeFile(path.toString(), recursive);
|
|
|
|
}
|
2016-01-09 12:51:55 -06:00
|
|
|
|
2016-03-19 16:35:24 -05:00
|
|
|
/// Make a temp copy of a file.
|
|
|
|
/// Primarily used by tests to avoid tainting the originals.
|
|
|
|
/// srcDir shouldn't end with '/' and srcFilename shouldn't contain '/'.
|
|
|
|
/// Returns the created file path.
|
|
|
|
inline
|
|
|
|
std::string getTempFilePath(const std::string srcDir, const std::string& srcFilename)
|
|
|
|
{
|
|
|
|
const std::string srcPath = srcDir + '/' + srcFilename;
|
|
|
|
|
|
|
|
std::string dstPath = std::tmpnam(nullptr);
|
|
|
|
dstPath += '_' + srcFilename;
|
|
|
|
|
|
|
|
Poco::File(srcPath).copyTo(dstPath);
|
|
|
|
return dstPath;
|
|
|
|
}
|
|
|
|
|
2016-01-13 08:34:43 -06:00
|
|
|
/// Returns the name of the signal.
|
2016-04-08 08:06:39 -05:00
|
|
|
const char *signalName(int signo);
|
2016-01-13 08:34:43 -06:00
|
|
|
|
2016-01-09 12:51:55 -06:00
|
|
|
/// Trap signals to cleanup and exit the process gracefully.
|
2016-02-01 19:26:19 -06:00
|
|
|
void setTerminationSignals();
|
|
|
|
void setFatalSignals();
|
2016-02-01 20:23:58 -06:00
|
|
|
|
2016-02-18 10:59:25 -06:00
|
|
|
void requestTermination(const Poco::Process::PID& pid);
|
2016-03-01 12:17:34 -06:00
|
|
|
|
2016-04-06 07:43:44 -05:00
|
|
|
int getMemoryUsage(const Poco::Process::PID nPid);
|
2016-03-31 03:01:21 -05:00
|
|
|
|
|
|
|
std::string replace(const std::string& s, const std::string& a, const std::string& b);
|
|
|
|
|
|
|
|
std::string formatLinesForLog(const std::string& s);
|
2016-04-07 02:55:57 -05:00
|
|
|
|
|
|
|
void setThreadName(const std::string& s);
|
2016-04-12 04:00:33 -05:00
|
|
|
|
2016-04-15 09:07:24 -05:00
|
|
|
/// Display version information
|
|
|
|
void displayVersionInfo(const char *app);
|
2016-04-18 17:52:10 -05:00
|
|
|
|
2016-04-20 08:43:00 -05:00
|
|
|
/// Return a string that is unique across processes and calls.
|
|
|
|
std::string UniqueId();
|
|
|
|
|
2016-04-18 17:52:10 -05:00
|
|
|
/// Given one or more patterns to allow, and one or more to deny,
|
|
|
|
/// the match member will return true if, and only if, the subject
|
|
|
|
/// matches the allowed list, but not the deny.
|
|
|
|
/// By default, everything is denied.
|
|
|
|
class RegexListMatcher
|
|
|
|
{
|
|
|
|
public:
|
2016-04-18 20:11:33 -05:00
|
|
|
RegexListMatcher()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2016-04-19 02:35:36 -05:00
|
|
|
RegexListMatcher(std::initializer_list<std::string> allowed) :
|
|
|
|
_allowed(allowed)
|
2016-04-18 20:11:33 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2016-04-19 02:35:36 -05:00
|
|
|
RegexListMatcher(std::initializer_list<std::string> allowed,
|
|
|
|
std::initializer_list<std::string> denied) :
|
|
|
|
_allowed(allowed),
|
|
|
|
_denied(denied)
|
2016-04-18 20:11:33 -05:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2016-04-18 17:52:10 -05:00
|
|
|
void allow(const std::string& pattern) { _allowed.insert(pattern); }
|
|
|
|
void deny(const std::string& pattern)
|
|
|
|
{
|
|
|
|
_allowed.erase(pattern);
|
|
|
|
_denied.insert(pattern);
|
|
|
|
}
|
|
|
|
|
2016-04-18 20:11:33 -05:00
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
_allowed.clear();
|
|
|
|
_denied.clear();
|
|
|
|
}
|
|
|
|
|
2016-04-18 17:52:10 -05:00
|
|
|
bool match(const std::string& subject) const
|
|
|
|
{
|
|
|
|
return (match(_allowed, subject) && !match(_denied, subject));
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
bool match(const std::set<std::string>& set, const std::string& subject) const
|
|
|
|
{
|
|
|
|
if (set.find(subject) != set.end())
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Not a perfect match, try regex.
|
|
|
|
for (const auto& value : set)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
// Not performance critical to warrant caching.
|
|
|
|
Poco::RegularExpression re(value, Poco::RegularExpression::RE_CASELESS);
|
2016-04-19 02:35:36 -05:00
|
|
|
Poco::RegularExpression::Match reMatch;
|
2016-04-18 17:52:10 -05:00
|
|
|
|
|
|
|
// Must be a full match.
|
2016-04-19 02:35:36 -05:00
|
|
|
if (re.match(subject, reMatch) && reMatch.offset == 0 && reMatch.length == subject.size())
|
2016-04-18 17:52:10 -05:00
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (const std::exception& exc)
|
|
|
|
{
|
|
|
|
// Nothing to do; skip.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::set<std::string> _allowed;
|
|
|
|
std::set<std::string> _denied;
|
|
|
|
};
|
|
|
|
|
2015-03-17 18:56:15 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|