#include "QFramework/TQLibrary.h"
#include "TTree.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQFolder.h"
#include "definitions.h"
#include "locals.h"
#include <iostream>
#include <stdlib.h>
#include "stdio.h"
#include "unistd.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <fstream>
#include <string>
#include <iostream>
#include <sys/ioctl.h>
#include <algorithm>
#include "TROOT.h"
#include "TInterpreter.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQPathManager.h"
int TQLibrary::stdoutfd(dup(fileno(stdout)));
int TQLibrary::stderrfd(dup(fileno(stderr)));
bool TQLibrary::stdoutfd_isRedirected(false);
bool TQLibrary::stderrfd_isRedirected(false);
bool TQLibrary::stdoutfd_allowRedirection(true);
bool TQLibrary::stderrfd_allowRedirection(true);
bool TQLibrary::stdoutstr_isCaptured(false);
bool TQLibrary::stderrstr_isCaptured(false);
bool TQLibrary::stdouterrstr_areCaptured(false);
bool TQLibrary::stdoutstr_allowCapturing(true);
bool TQLibrary::stderrstr_allowCapturing(true);
std::streambuf* TQLibrary::defaultStdoutStreamBuf(NULL);
std::streambuf* TQLibrary::defaultStderrStreamBuf(NULL);
std::stringstream* TQLibrary::capturingStdoutStream(NULL);
std::stringstream* TQLibrary::capturingStderrStream(NULL);
std::stringstream* TQLibrary::capturingStdoutStderrStream(NULL);
TQMessageStream TQLibrary::msgStream(std::cout);
TQLibrary* TQLibrary::getQLibrary(){
if(TQLibrary::isInitialized)
return &TQLibrary::gQFramework;
return NULL;
}
TQLibrary TQLibrary::gQFramework;
bool TQLibrary::isInitialized(false);
TQLibrary::TQLibrary() :
#ifdef VC_VERSION
libversion(VC_VERSION),
#else
libversion("UNKNOWN"),
#endif
#ifdef ROOTVERSION
rootversion(ROOTVERSION),
#else
rootversion("UNKNOWN"),
#endif
#ifdef GCCVERSION
gccversion(GCCVERSION),
#else
gccversion("UNKNOWN"),
#endif
#ifdef TQPATH
tqpath(TQPATH),
#else
tqpath(""),
#endif
eosmgmurl("root://eosuser.cern.ch"),
eoscmd("xrdfs eosatlas.cern.ch"),
#ifdef LOCALGROUPDISK
localGroupDiskIdentifier(LOCALGROUPDISK),
#else
localGroupDiskIdentifier(""),
#endif
#ifdef DQ2PATHHEAD
dq2PathHead(DQ2PATHHEAD),
#else
dq2PathHead(""),
#endif
#ifdef DCACHEPATHHEAD
dCachePathHead(DCACHEPATHHEAD),
#else
dCachePathHead(""),
#endif
dq2cmd("dq2"),
website("http://atlas-caf.web.cern.ch/"),
appName("My CAFCore App"),
procStatPath("/proc/self/stat"),
#ifdef PDFFONTEMBEDCMD
pdfFontEmbedCommand(PDFFONTEMBEDCMD),
#else
pdfFontEmbedCommand("mv $(filename) $(filename).bak && ( gs -q -dNOPAUSE -dBATCH -dPDFSETTINGS=/prepress -sDEVICE=pdfwrite -sOutputFile=$(filename) $(filename).bak && rm $(filename).bak ) || mv $(filename).bak $(filename)"),
#endif
pdfFontEmbedEnabled(false),
#ifdef EXIFTOOLPATH
exiftoolPath(EXIFTOOLPATH),
#else
exiftoolPath(""),
#endif
exiftoolEnabled(false),
#ifdef LIBXMLPATH
libXMLpath(LIBXMLPATH)
#else
libXMLpath(TQLibrary::findLibrary("libxml2*.so*"))
#endif
{
this->timeOfConstruction = TQUtils::getCurrentTime();
TTree::SetMaxTreeSize(1e15);
char cCurrentPath[FILENAME_MAX];
if (getcwd(cCurrentPath, sizeof(cCurrentPath)))
this->workingDirectory = TString(cCurrentPath);
if (this == &TQLibrary::gQFramework){
DEBUG("The static member gQFramework is being created.");
TQLibrary::isInitialized = true;
}
else{
DEBUG("An instance of TQLibrary that is not the static member gQFramework is being created.");
}
#ifdef PACKAGES
for(auto pkg:PACKAGES){
packages.push_back(pkg);
}
#endif
#ifdef CONSOLEWIDTH
this->setConsoleWidth(CONSOLEWIDTH);
#else
this->findConsoleWidth();
#endif
}
TQLibrary::~TQLibrary(){
if (this->snowflakeMode){
for (auto type = TQMessageStream::messageTypesAlert.begin(); type != TQMessageStream::messageTypesAlert.end(); type++){
unsigned int messageCount = TQMessageStream::getGlobMessageCount(*type);
if ((*type == TQMessageStream::WARNING) && (messageCount <= this->maxWarningsAllowed))
continue;
if (messageCount > 0){
if (TQPathManager::getPathManager())
TQPathManager::getPathManager()->~TQPathManager();
printGlobAlertMessageCount();
BREAK("You are running in snowflake mode and the allowed number of alert messages was exceeded (have %d alert messages; allowed are %d alert messages).", messageCount, this->maxWarningsAllowed);
}
}
}
if (this == &TQLibrary::gQFramework){
DEBUGclass("The static member gQFramework is being destroyed.");
TQLibrary::isInitialized = false;
}
else{
DEBUGclass("An instance of TQLibrary that is not the static member gQFramework is being destroyed.");
}
}
const TString& TQLibrary::getLocalGroupDisk(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.localGroupDiskIdentifier;
}
void TQLibrary::setLocalGroupDisk(const TString& lcgid){
this->localGroupDiskIdentifier = lcgid;
}
const TString& TQLibrary::getDQ2PathHead(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.dq2PathHead;
}
void TQLibrary::setDQ2PathHead(const TString& dq2ph){
this->dq2PathHead = dq2ph;
}
const TString& TQLibrary::getdCachePathHead(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.dCachePathHead;
}
void TQLibrary::setdCachePathHead(const TString& dCache2ph){
this->dCachePathHead = dCache2ph;
}
const TString& TQLibrary::getDQ2cmd(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.dq2cmd;
}
void TQLibrary::setDQ2cmd(const TString& dq2command){
this->dq2cmd = dq2command;
}
TString TQLibrary::getEOScmd(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return "export EOS_MGM_URL="+TQLibrary::gQFramework.eosmgmurl + "; " + TQLibrary::gQFramework.eoscmd;
}
void TQLibrary::setEOScmd(TString neweoscmd){
this->eoscmd = neweoscmd;
}
void TQLibrary::setEOSurl(TString neweosurl){
this->eosmgmurl = neweosurl;
}
void TQLibrary::printMessage(){
std::cout << "This is libQFramework rev. " << TQLibrary::getVersion() << ", compiled with root " << TQLibrary::getROOTVersion() << " and g++ " << TQLibrary::getGCCVersion() << std::endl;
std::cout << "for bug reports, feature requests and general questions, please contact cburgard@cern.ch" << std::endl;
}
const TString& TQLibrary::getVersion(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.libversion;
}
const TString& TQLibrary::getROOTVersion(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.rootversion;
}
const TString& TQLibrary::getGCCVersion(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.gccversion;
}
int TQLibrary::getVersionNumber(){
if (!TQLibrary::isInitialized) return 0;
return atoi(TQLibrary::gQFramework.libversion);
}
float TQLibrary::getROOTVersionNumber(){
if (!TQLibrary::isInitialized) return 0;
return atoi(TQLibrary::gQFramework.rootversion);
}
float TQLibrary::getGCCVersionNumber(){
if (!TQLibrary::isInitialized) return 0;
return atoi(TQLibrary::gQFramework.gccversion);
}
int TQLibrary::redirect_stdout(const TString& fname, bool append){
if(!TQLibrary::stdoutfd_allowRedirection) return -1;
if(TQLibrary::stdoutfd_isRedirected) return -2;
if(TQLibrary::stdoutstr_isCaptured) return -3;
fflush(stdout);
int newstdout = append ? open(fname.Data(), O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) : open(fname.Data(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstdout, fileno(stdout));
close(newstdout);
TQLibrary::stdoutfd_isRedirected = true;
return fileno(stdout);
}
int TQLibrary::restore_stdout(){
if (TQLibrary::stdoutfd_isRedirected){
fflush(stdout);
dup2(TQLibrary::stdoutfd, fileno(stdout));
TQLibrary::stdoutfd_isRedirected = false;
return TQLibrary::stdoutfd;
}
else if (TQLibrary::stdoutstr_isCaptured){
if (TQLibrary::stdouterrstr_areCaptured){
VERBOSE("Call TQLibrary::restore() to end capturing of stdout and stderr. Not restoring stdout.");
return -2;
}
std::cout.rdbuf(TQLibrary::defaultStdoutStreamBuf);
delete TQLibrary::capturingStdoutStream;
TQLibrary::capturingStdoutStream = NULL;
TQLibrary::stdoutstr_isCaptured = false;
return 0;
}
return -1;
}
TString TQLibrary::readCapturedStdout(){
if (!TQLibrary::stdoutstr_isCaptured) return "";
return TQLibrary::capturingStdoutStream->str();
}
int TQLibrary::resetCapturedStdout(){
if (!TQLibrary::stdoutstr_isCaptured) return -3;
TQLibrary::capturingStdoutStream->str("");
TQLibrary::capturingStdoutStream->clear();
return 0;
}
TString TQLibrary::readAndResetCapturedStdout(){
TString str = TQLibrary::readCapturedStdout();
TQLibrary::resetCapturedStdout();
return str;
}
TString TQLibrary::readCapturedStderr(){
if (!TQLibrary::stderrstr_isCaptured) return "";
return TQLibrary::capturingStderrStream->str();
}
int TQLibrary::resetCapturedStderr(){
if (!TQLibrary::stderrstr_isCaptured) return -3;
TQLibrary::capturingStderrStream->str("");
TQLibrary::capturingStderrStream->clear();
return 0;
}
TString TQLibrary::readAndResetCapturedStderr(){
TString str = TQLibrary::readCapturedStderr();
TQLibrary::resetCapturedStderr();
return str;
}
TString TQLibrary::readCapturedStdoutStderr(){
if (!TQLibrary::stdouterrstr_areCaptured) return "";
return TQLibrary::capturingStdoutStderrStream->str();
}
int TQLibrary::resetCapturedStdoutStderr(){
if (!TQLibrary::stdouterrstr_areCaptured) return -3;
TQLibrary::capturingStdoutStderrStream->str("");
TQLibrary::capturingStdoutStderrStream->clear();
return 0;
}
TString TQLibrary::readAndResetCapturedStdoutStderr(){
TString str = TQLibrary::readCapturedStdoutStderr();
TQLibrary::resetCapturedStdoutStderr();
return str;
}
int TQLibrary::redirect_stderr(const TString& fname, bool append){
if(!TQLibrary::stderrfd_allowRedirection) return -1;
if(TQLibrary::stderrfd_isRedirected) return -2;
if(TQLibrary::stderrstr_isCaptured) return -3;
fflush(stderr);
int newstderr = append ? open(fname.Data(), O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) : open(fname.Data(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstderr, fileno(stderr));
close(newstderr);
TQLibrary::stderrfd_isRedirected = true;
return newstderr;
}
int TQLibrary::restore_stderr(){
if(TQLibrary::stderrfd_isRedirected){
fflush(stderr);
dup2(TQLibrary::stderrfd, fileno(stderr));
TQLibrary::stderrfd_isRedirected = false;
return TQLibrary::stderrfd;
}
else if (TQLibrary::stderrstr_isCaptured){
if (TQLibrary::stdouterrstr_areCaptured){
VERBOSE("Call TQLibrary::restore() to end capturing of stdout and stderr. Not restoring stderr.");
return -2;
}
std::cerr.rdbuf(TQLibrary::defaultStderrStreamBuf);
delete TQLibrary::capturingStderrStream;
TQLibrary::capturingStderrStream = NULL;
TQLibrary::stderrstr_isCaptured = false;
return 0;
}
return -1;
}
int TQLibrary::captureStdout(){
if(!TQLibrary::stdoutstr_allowCapturing) return -1;
if(TQLibrary::stdoutfd_isRedirected) return -2;
if(TQLibrary::stdoutstr_isCaptured) return -3;
TQLibrary::capturingStdoutStream = new std::stringstream();
std::cout.flush();
TQLibrary::defaultStdoutStreamBuf = std::cout.rdbuf();
std::cout.rdbuf(TQLibrary::capturingStdoutStream->rdbuf());
TQLibrary::stdoutstr_isCaptured = true;
return 0;
}
int TQLibrary::captureStderr(){
if(!TQLibrary::stderrstr_allowCapturing) return -1;
if(TQLibrary::stderrfd_isRedirected) return -2;
if(TQLibrary::stderrstr_isCaptured) return -3;
TQLibrary::capturingStderrStream = new std::stringstream();
std::cerr.flush();
TQLibrary::defaultStderrStreamBuf = std::cerr.rdbuf();
std::cerr.rdbuf(TQLibrary::capturingStderrStream->rdbuf());
TQLibrary::stderrstr_isCaptured = true;
return 0;
}
int TQLibrary::captureStdoutStderr(){
if ((!TQLibrary::stdoutstr_allowCapturing) or
(!TQLibrary::stderrstr_allowCapturing))
return -1;
if ((TQLibrary::stdoutfd_isRedirected) or
(TQLibrary::stderrfd_isRedirected))
return -2;
if ((TQLibrary::stdoutstr_isCaptured) or
(TQLibrary::stderrstr_isCaptured))
return -3;
TQLibrary::capturingStdoutStderrStream = new std::stringstream();
std::cout.flush();
std::cerr.flush();
TQLibrary::defaultStdoutStreamBuf = std::cout.rdbuf();
TQLibrary::defaultStderrStreamBuf = std::cerr.rdbuf();
std::cout.rdbuf(TQLibrary::capturingStdoutStderrStream->rdbuf());
std::cerr.rdbuf(TQLibrary::capturingStdoutStderrStream->rdbuf());
TQLibrary::stdoutstr_isCaptured = true;
TQLibrary::stderrstr_isCaptured = true;
TQLibrary::stdouterrstr_areCaptured = true;
return 0;
}
void TQLibrary::allowRedirection_stdout(bool allow){
if (TQLibrary::stdouterrstr_areCaptured)
TQLibrary::restore();
else
TQLibrary::restore_stdout();
TQLibrary::stdoutfd_allowRedirection = allow;
}
void TQLibrary::allowRedirection_stderr(bool allow){
if (TQLibrary::stdouterrstr_areCaptured)
TQLibrary::restore();
else
TQLibrary::restore_stderr();
TQLibrary::stderrfd_allowRedirection = allow;
}
void TQLibrary::allowRedirection(bool allow){
TQLibrary::restore();
TQLibrary::stdoutfd_allowRedirection = allow;
TQLibrary::stderrfd_allowRedirection = allow;
}
void TQLibrary::allowCapturing_stdout(bool allow){
if (TQLibrary::stdouterrstr_areCaptured)
TQLibrary::restore();
else
TQLibrary::restore_stdout();
TQLibrary::stdoutstr_allowCapturing = allow;
}
void TQLibrary::allowCapturing_stderr(bool allow){
if (TQLibrary::stdouterrstr_areCaptured)
TQLibrary::restore();
else
TQLibrary::restore_stderr();
TQLibrary::stderrstr_allowCapturing = allow;
}
void TQLibrary::allowCapturing(bool allow){
TQLibrary::restore();
TQLibrary::stdoutstr_allowCapturing = allow;
TQLibrary::stderrstr_allowCapturing = allow;
}
int TQLibrary::redirect(const TString& fname, bool append){
if(!TQLibrary::stdoutfd_allowRedirection || !TQLibrary::stderrfd_allowRedirection) return -1;
if(TQLibrary::stdoutfd_isRedirected || TQLibrary::stderrfd_isRedirected) return -2;
fflush(stdout);
fflush(stderr);
int newstdeo = append ? open(fname.Data(), O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) : open(fname.Data(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
dup2(newstdeo, fileno(stdout));
dup2(newstdeo, fileno(stderr));
close(newstdeo);
TQLibrary::stdoutfd_isRedirected = true;
TQLibrary::stderrfd_isRedirected = true;
return newstdeo;
}
bool TQLibrary::restore(){
if (!TQLibrary::stdouterrstr_areCaptured){
TQLibrary::restore_stderr();
TQLibrary::restore_stdout();
}
else{
std::cout.rdbuf(TQLibrary::defaultStdoutStreamBuf);
std::cerr.rdbuf(TQLibrary::defaultStderrStreamBuf);
delete TQLibrary::capturingStdoutStderrStream;
TQLibrary::capturingStdoutStderrStream = NULL;
TQLibrary::stdoutstr_isCaptured = false;
TQLibrary::stderrstr_isCaptured = false;
TQLibrary::stdouterrstr_areCaptured = false;
}
return true;
}
Long64_t TQLibrary::getVirtualMemory(){
try {
std::string line;
std::ifstream myfile (TQLibrary::getProcStatPath().Data());
if (myfile.is_open()){
std::string pid, comm, state, ppid, pgrp, session, tty_nr;
std::string tpgid, flags, minflt, cminflt, majflt, cmajflt;
std::string utime, stime, cutime, cstime, priority, nice;
std::string O, itrealvalue, starttime;
Long64_t vsize;
Long64_t rss;
if( myfile.good() ){
myfile >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
>> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
>> utime >> stime >> cutime >> cstime >> priority >> nice
>> O >> itrealvalue >> starttime >> vsize >> rss;
}
myfile.close();
return vsize;
}
} catch (const std::bad_alloc& oom){
}
return -1;
}
void TQLibrary::printMemory(){
Long64_t vsize = getVirtualMemory();
if(vsize>0){
std::cout << TQLibrary::getApplicationName() <<": virtual memory used = " << TQStringUtils::fixedWidth(TQStringUtils::getThousandsSeparators(vsize,"'"),20) << std::endl;
} else {
std::cout << "Unable to open file" << std::endl;
}
}
void TQLibrary::recordMemory(short color) {
if (!TQLibrary::isInitialized) return;
try {
TQLibrary::gQFramework.rssUsageTimestamps.push_back(TQUtils::getCurrentTime());
TQLibrary::gQFramework.rssUsageMemory.push_back(TQUtils::getCurrentRSS());
TQLibrary::gQFramework.rssUsageColors.push_back(color);
} catch (const std::bad_alloc& oom){
}
return;
}
TMultiGraph* TQLibrary::getMemoryGraph(bool differential) {
if (!TQLibrary::isInitialized) return NULL;
std::vector<double>timestamps(TQLibrary::gQFramework.rssUsageTimestamps.begin(),TQLibrary::gQFramework.rssUsageTimestamps.end());
std::vector<double>memory(TQLibrary::gQFramework.rssUsageMemory.begin(),TQLibrary::gQFramework.rssUsageMemory.end());
if (differential) {
std::vector<double> deltaMemory;
deltaMemory.reserve(memory.size());
for (size_t i=0; i<memory.size(); ++i) {
if (i==0) {
deltaMemory.push_back(0.);
} else {
deltaMemory.push_back(memory[i]-memory[i-1]);
}
}
return TQHistogramUtils::makeMultiColorGraph(timestamps, deltaMemory, TQLibrary::gQFramework.rssUsageColors);
}
return TQHistogramUtils::makeMultiColorGraph(timestamps, memory, TQLibrary::gQFramework.rssUsageColors);
}
const TString& TQLibrary::getProcStatPath(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.procStatPath;
}
void TQLibrary::setProcStatPath(TString newpath){
this->procStatPath = newpath;
}
const TString& TQLibrary::getEXIFtoolPath(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.exiftoolPath;
}
void TQLibrary::setEXIFtoolPath(TString newpath){
this->exiftoolPath = newpath;
}
bool TQLibrary::hasEXIFsupport(){
return TQLibrary::isInitialized &&gQFramework.exiftoolEnabled && !(gQFramework.exiftoolPath.IsNull());
}
bool TQLibrary::enableEXIFsupport(bool val){
if (!TQLibrary::isInitialized) return false;
if(TQLibrary::gQFramework.exiftoolPath.IsNull()) return false;
TQLibrary::gQFramework.exiftoolEnabled = val;
return true;
}
bool TQLibrary::setEXIF(const TString& fname, const TString& title, const TString& keywords){
if(title.IsNull() || keywords.IsNull()) return false;
if(!TQLibrary::hasEXIFsupport()) return false;
system(TQLibrary::getEXIFtoolPath() + " -Author=\"$(whoami)\" -Title=\""+title+"\" -Keywords=\""+keywords+"\" -Creator\"="+TQLibrary::getApplicationName()+" with libQFramework rev. "+TQLibrary::getVersion()+" (ROOT "+TQLibrary::getROOTVersion() + ", g++ " + TQLibrary::getGCCVersion() + ")\" " + fname);
return true;
}
const TString& TQLibrary::getPDFfontEmbedCommand(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.pdfFontEmbedCommand;
}
void TQLibrary::setPDFfontEmbedCommand(TString cmd){
this->pdfFontEmbedCommand = cmd;
}
bool TQLibrary::hasPDFfontEmbedding(){
return TQLibrary::isInitialized && gQFramework.pdfFontEmbedEnabled && !(gQFramework.pdfFontEmbedCommand.IsNull());
}
bool TQLibrary::enablePDFfontEmbedding(bool val){
if (!TQLibrary::isInitialized) return false;
if(TQLibrary::gQFramework.pdfFontEmbedCommand.IsNull()) return false;
TQLibrary::gQFramework.pdfFontEmbedEnabled = val;
return true;
}
bool TQLibrary::embedFonts(const TString& filename, bool verbose){
if(!TQLibrary::hasPDFfontEmbedding()) return false;
TString cmd(TQLibrary::getPDFfontEmbedCommand());
cmd.ReplaceAll("$(filename)",filename);
TList* result = TQUtils::execute(cmd);
if(!result) return false;
if(verbose && (result->GetEntries() > 0)){
msgStream.sendFunctionMessage(TQMessageStream::VERBOSE,__FUNCTION__,"embedding fonts for file %s",filename.Data());
TQIterator itr(result);
while(itr.hasNext()){
TObject* obj = itr.readNext();
msgStream.sendFunctionMessage(TQMessageStream::VERBOSE,__FUNCTION__,obj->GetName());
}
}
delete result;
return true;
}
const TString& TQLibrary::getApplicationName(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.appName;
}
void TQLibrary::setApplicationName(TString newname){
this->appName = newname;
}
TString TQLibrary::getAbsolutePath(const TString& path){
if(path.IsNull()) return TQLibrary::getWorkingDirectory();
if(path[0]=='/') return path;
return TQFolder::concatPaths(TQLibrary::getWorkingDirectory(),path);
}
const TString& TQLibrary::getWorkingDirectory(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.workingDirectory;
}
void TQLibrary::setWorkingDirectory(TString newpath){
this->workingDirectory = newpath;
}
const TString& TQLibrary::pwd(){
return TQLibrary::getWorkingDirectory();
}
void TQLibrary::cd(TString newpath){
this->workingDirectory = newpath;
}
const TString& TQLibrary::getTQPATH(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.tqpath;
}
void TQLibrary::setTQPATH(TString newpath){
this->tqpath = newpath;
}
const TString& TQLibrary::getlibXMLpath(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.libXMLpath;
}
const TString& TQLibrary::getWebsite(){
if (!TQLibrary::isInitialized) return TQStringUtils::emptyString;
return TQLibrary::gQFramework.website;
}
void TQLibrary::setMessageStream(std::ostream& os, bool allowColors){
TQLibrary::msgStream.absorb(TQMessageStream(os,false,allowColors));
}
void TQLibrary::setMessageStream(std::ostream* os, bool allowColors){
TQLibrary::msgStream.absorb(TQMessageStream(os,false,allowColors));
}
bool TQLibrary::openLogFile(const TString& fname, bool allowColors){
INFOfunc(TQUtils::getTimeStamp()+ " - attempting to use log file '%s'",fname.Data());
TQLibrary::msgStream.absorb(TQMessageStream(fname,allowColors));
if(msgStream.isGood()){
INFOfunc(TQUtils::getTimeStamp()+ " - successfully opened log file for writing");
} else {
ERRORfunc(TQUtils::getTimeStamp()+ " - failed to open log file for writing");
}
return true;
}
bool TQLibrary::closeLogFile(){
INFOfunc(TQUtils::getTimeStamp()+ " - closing log");
TQLibrary::setMessageStream(std::cout,true);
INFOfunc(TQUtils::getTimeStamp()+ " - closed log file");
return true;
}
int TQLibrary::getConsoleWidth(){
return TQLibrary::gQFramework.consoleWidth;
}
void TQLibrary::setConsoleWidth(int width){
TQLibrary::gQFramework.consoleWidth = width;
}
void TQLibrary::findConsoleWidth(){
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
this->consoleWidth = std::max(std::min((int)(w.ws_col),(int)300),40);
}
TString TQLibrary::findLibrary(const TString& filename){
TString retval = "";
TList* paths = TQUtils::execute("find $(g++ --print-search-dirs | grep libraries | sed -e 's/^[ ]*libraries:[ ]*=//' -e 's/:/ /g') -name '"+filename+".*so' 2>/dev/null -print -quit",255);
paths->SetOwner(true);
if(!paths) return retval;
if(paths->GetEntries() > 0){
retval = paths->First()->GetName();
}
delete paths;
return retval;
}
bool TQLibrary::hasPackage(const char* pkgname){
for(const auto& pkg:TQLibrary::getQLibrary()->packages){
if(TQStringUtils::equal(pkgname,pkg)) return true;
}
return false;
}
std::vector<std::string> TQLibrary::getListOfPackages() {
std::vector<std::string> pks;
for (std::string p : TQLibrary::getQLibrary()->packages) {
pks.push_back(p);
}
return pks;
}
void TQLibrary::printGlobMessageCount(){
TQMessageStream::printGlobMessageCount();
}
void TQLibrary::printGlobAlertMessageCount(){
TQMessageStream::printGlobAlertMessageCount();
}
void TQLibrary::setSnowflakeMode(bool snowflakeMode, unsigned int maxWarningsAllowed){
this->snowflakeMode = snowflakeMode;
this->maxWarningsAllowed = maxWarningsAllowed;
}
bool TQLibrary::getSnowflakeMode(){
return this->snowflakeMode;
}
unsigned long TQLibrary::getTimeOfConstruction(){
return this->timeOfConstruction;
}
unsigned long TQLibrary::getTimeSinceConstruction(){
return TQUtils::getCurrentTime() - this->timeOfConstruction;
}