diff options
author | Joe George <joe@zeroc.com> | 2015-03-03 17:30:50 -0500 |
---|---|---|
committer | Joe George <joe@zeroc.com> | 2015-05-12 11:41:55 -0400 |
commit | d35bb9f5c19e34aee31f83d445695a8186ef675e (patch) | |
tree | d5324eaf44f5f9776495537c51653f50a66a7237 /cpp/src/Slice/FileTracker.cpp | |
download | ice-d35bb9f5c19e34aee31f83d445695a8186ef675e.tar.bz2 ice-d35bb9f5c19e34aee31f83d445695a8186ef675e.tar.xz ice-d35bb9f5c19e34aee31f83d445695a8186ef675e.zip |
Ice 3.4.2 Source Distributionv3.4.2
Diffstat (limited to 'cpp/src/Slice/FileTracker.cpp')
-rw-r--r-- | cpp/src/Slice/FileTracker.cpp | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/cpp/src/Slice/FileTracker.cpp b/cpp/src/Slice/FileTracker.cpp new file mode 100644 index 00000000000..af009feb281 --- /dev/null +++ b/cpp/src/Slice/FileTracker.cpp @@ -0,0 +1,209 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <Slice/FileTracker.h> + +#ifdef __sun +# include <unistd.h> +#endif + +#ifdef _WIN32 +# include <direct.h> +#endif + +using namespace std; + +Slice::FileException::FileException(const char* file, int line, const string& r) : + IceUtil::Exception(file, line), + _reason(r) +{ +} + +Slice::FileException::~FileException() throw() +{ +} + +const char* Slice::FileException::_name = "Slice::FileException"; + +string +Slice::FileException::ice_name() const +{ + return _name; +} + +void +Slice::FileException::ice_print(ostream& out) const +{ +#if defined(_MSC_VER) && (_MSC_VER < 1300) + Exception::ice_print(out); +#else + IceUtil::Exception::ice_print(out); +#endif + out << ": " << _reason; +} + +IceUtil::Exception* +Slice::FileException::ice_clone() const +{ + return new FileException(*this); +} + +void +Slice::FileException::ice_throw() const +{ + throw *this; +} + +string +Slice::FileException::reason() const +{ + return _reason; +} + + +static Slice::FileTrackerPtr Instance; + +Slice::FileTracker::FileTracker() : + _curr(_generated.end()) +{ +} + +Slice::FileTracker::~FileTracker() +{ +} + +// The file tracker is not supposed to be thread safe. +Slice::FileTrackerPtr +Slice::FileTracker::instance() +{ + if(!Instance) + { + Instance = new FileTracker(); + } + return Instance; +} + +void +Slice::FileTracker::setSource(const string& source) +{ + _source = source; + pair<map<string, list<string> >::iterator, bool> p = _generated.insert(make_pair(source, list<string>())); + assert(p.second); + _curr = p.first; +} + +void +Slice::FileTracker::setOutput(const string& output, bool error) +{ + assert(!_source.empty()); + _errors.insert(make_pair(_source, output)); + if(error) + { + _curr = _generated.end(); + } +} + +void +Slice::FileTracker::addFile(const string& file) +{ + _files.push_front(make_pair(file, false)); + if(_curr != _generated.end()) + { + _curr->second.push_back(file); + } +} + +void +Slice::FileTracker::addDirectory(const string& dir) +{ + _files.push_front(make_pair(dir, true)); +} + +void +Slice::FileTracker::cleanup() +{ + for(list<pair<string, bool> >::const_iterator p = _files.begin(); p != _files.end(); ++p) + { + if(!p->second) + { +#ifdef _WIN32 + _unlink(p->first.c_str()); +#else + unlink(p->first.c_str()); +#endif + } + else + { +#ifdef _WIN32 + _rmdir(p->first.c_str()); +#else + rmdir(p->first.c_str()); +#endif + } + } +} + +void +Slice::FileTracker::dumpxml() +{ + cout << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl; + + cout << "<generated>" << endl; + for(map<string, string>::const_iterator p = _errors.begin(); p != _errors.end(); ++p) + { + cout << " <source name=\"" << p->first << "\""; + + map<string, list<string> >::const_iterator q = _generated.find(p->first); + if(q == _generated.end()) + { + cout << " error=\"true\">" << endl; + } + else + { + cout << ">" << endl; + for(list<string>::const_iterator r = q->second.begin(); r != q->second.end(); ++r) + { + cout << " <file name=\"" << *r << "\"/>" << endl; + } + } + cout << " <output>" << escape(p->second) << "</output>" << endl; + cout << " </source>" << endl; + } + cout << "</generated>" << endl; +} + +string +Slice::FileTracker::escape(const string& str) const +{ + ostringstream ostr; + + for(string::const_iterator p = str.begin(); p != str.end(); ++p) + { + switch(*p) + { + case '<': + ostr << "<"; + break; + case '>': + ostr << ">"; + break; + case '&': + ostr << "&"; + break; + case '"': + ostr << """; + break; + default: + ostr << *p; + break; + } + } + + return ostr.str(); +} |