From 938ed7622656c3494ae8fdb83bc2ad4b1f31d901 Mon Sep 17 00:00:00 2001 From: Adrian Kummerländer Date: Fri, 25 Apr 2014 17:44:32 +0200 Subject: Improved argument resolution and error handling * execute member method internal argument count checks are not needed when using between one and two arguments ** xalan automatically generates the appropriate message containing the getError message when only offered fixed argument execute member overloads * improved FunctionReadDirectory attribute element generation * added additional validations to FunctionReadFile and FunctionReadXMLFile * I plan to return errors inside a DOM tree alongside the function return values in the future --- src/function/read_directory.cc | 48 ++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 23 deletions(-) (limited to 'src/function/read_directory.cc') diff --git a/src/function/read_directory.cc b/src/function/read_directory.cc index 245f311..9711239 100644 --- a/src/function/read_directory.cc +++ b/src/function/read_directory.cc @@ -15,41 +15,43 @@ FunctionReadDirectory::FunctionReadDirectory(const FilesystemContext& context): documents_(std::make_shared>()) { } xalan::XObjectPtr FunctionReadDirectory::execute( - xalan::XPathExecutionContext& executionContext, - xalan::XalanNode* context, - const xalan::Function::XObjectArgVectorType& arguments, - const xalan::Locator* locator + xalan::XPathExecutionContext& executionContext, + xalan::XalanNode*, + const xalan::XObjectPtr argument, + const xalan::Locator* ) const { - if ( arguments.size() != 1 ) { - xalan::XPathExecutionContext::GetAndReleaseCachedString guard( - executionContext - ); - - this->generalError(executionContext, context, locator); - } - this->documents_->emplace("content"); DomDocumentGuard& domDocument = this->documents_->top(); xercesc::DOMNode* const rootNode = domDocument->getDocumentElement(); this->fs_context_.iterate( - arguments[0]->str(), + argument->str(), [&domDocument, &rootNode](const boost::filesystem::path& p) { xercesc::DOMElement* const itemNode( domDocument->createElement(*XercesStringGuard("item")) ); - if ( boost::filesystem::is_regular_file(p) ) { - itemNode->setAttribute( - *XercesStringGuard("type"), - *XercesStringGuard("file") - ); - } else if ( boost::filesystem::is_directory(p) ) { - itemNode->setAttribute( - *XercesStringGuard("type"), - *XercesStringGuard("directory") - ); + 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: { + break; + }; } xercesc::DOMText* const textNode( -- cgit v1.2.3