#include "read_directory.h" #include #include #include #include #include "support/xerces_string_guard.h" namespace InputXSLT { xercesc::DOMDocument* FunctionReadDirectory::constructDocument( const InputXSLT::FilesystemContext& fsContext, const FunctionBase::parameter_tuple& parameters ) { const boost::filesystem::path directoryPath( fsContext.resolve(std::get<0>(parameters)) ); xercesc::DOMDocument* const domDocument( xercesc::DOMImplementation::getImplementation()->createDocument( nullptr, *XercesStringGuard("content"), nullptr ) ); xercesc::DOMNode* const rootNode( domDocument->getDocumentElement() ); if ( boost::filesystem::is_directory(directoryPath) ) { fsContext.iterate( directoryPath, [&domDocument, &rootNode](const boost::filesystem::path& p) { xercesc::DOMElement* const itemNode( domDocument->createElement(*XercesStringGuard("result")) ); switch ( boost::filesystem::status(p).type() ) { case boost::filesystem::regular_file: { itemNode->setAttribute( *XercesStringGuard("type"), *XercesStringGuard("file") ); break; }; case boost::filesystem::directory_file: { itemNode->setAttribute( *XercesStringGuard("type"), *XercesStringGuard("directory") ); break; }; default: { itemNode->setAttribute( *XercesStringGuard("type"), *XercesStringGuard("misc") ); break; }; } xercesc::DOMText* const textNode( domDocument->createTextNode( *XercesStringGuard(p.filename().string()) ) ); itemNode->appendChild(textNode); rootNode->appendChild(itemNode); }); } else { xercesc::DOMElement* const resultNode( domDocument->createElement(*XercesStringGuard("error")) ); rootNode->appendChild(resultNode); } return domDocument; } }