diff --git src/libcmis/atom-folder.cxx src/libcmis/atom-folder.cxx index 68fb124..2756a5d 100644 --- src/libcmis/atom-folder.cxx +++ src/libcmis/atom-folder.cxx @@ -57,8 +57,11 @@ vector< libcmis::ObjectPtr > AtomFolder::getChildren( ) throw ( libcmis::Excepti { AtomLink* childrenLink = getLink( "down", "application/atom+xml;type=feed" ); + // Some servers aren't giving the GetChildren properly... if not defined, we need to try + // as we may have the right to proceed. if ( ( NULL == childrenLink ) || ( getAllowableActions( ).get() && - !getAllowableActions()->isAllowed( libcmis::ObjectAction::GetChildren ) ) ) + ( !getAllowableActions()->isAllowed( libcmis::ObjectAction::GetChildren ) && + getAllowableActions()->isDefined( libcmis::ObjectAction::GetChildren ) ) ) ) throw libcmis::Exception( string( "GetChildren not allowed on node " ) + getId() ); vector< libcmis::ObjectPtr > children; @@ -182,7 +185,8 @@ libcmis::DocumentPtr AtomFolder::createDocument( const map< string, libcmis::Pro AtomLink* childrenLink = getLink( "down", "application/atom+xml;type=feed" ); if ( ( NULL == childrenLink ) || ( getAllowableActions( ).get() && - !getAllowableActions()->isAllowed( libcmis::ObjectAction::CreateDocument ) ) ) + !getAllowableActions()->isAllowed( libcmis::ObjectAction::CreateDocument ) && + getAllowableActions()->isDefined( libcmis::ObjectAction::CreateDocument ) ) ) throw libcmis::Exception( string( "CreateDocument not allowed on folder " ) + getId() ); xmlBufferPtr buf = xmlBufferCreate( ); @@ -210,9 +214,37 @@ libcmis::DocumentPtr AtomFolder::createDocument( const map< string, libcmis::Pro } string respBuf = response->getStream( )->str( ); - xmlDocPtr doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, 0 ); + xmlDocPtr doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, XML_PARSE_NOERROR ); if ( NULL == doc ) - throw libcmis::Exception( "Failed to parse object infos" ); + { + // We may not have the created document entry in the response body: this is + // the behaviour of some servers, but the standard says we need to look for + // the Location header. + map< string, string >& headers = response->getHeaders( ); + map< string, string >::iterator it = headers.find( "Location" ); + + // Some servers like Lotus Live aren't sending Location header, but Content-Location + if ( it == headers.end( ) ) + it = headers.find( "Content-Location" ); + + if ( it != headers.end() ) + { + try + { + response = getSession( )->httpGetRequest( it->second ); + respBuf = response->getStream( )->str( ); + doc = xmlReadMemory( respBuf.c_str(), respBuf.size(), getInfosUrl().c_str(), NULL, XML_PARSE_NOERROR ); + } + catch ( const CurlException& e ) + { + throw e.getCmisException( ); + } + } + + // if doc is still NULL after that, then throw an exception + if ( NULL == doc ) + throw libcmis::Exception( "Missing expected response from server" ); + } libcmis::ObjectPtr created = getSession( )->createObjectFromEntryDoc( doc ); xmlFreeDoc( doc ); diff --git src/libcmis/atom-object.cxx src/libcmis/atom-object.cxx index b7b3b4a..812951d 100644 --- src/libcmis/atom-object.cxx +++ src/libcmis/atom-object.cxx @@ -140,6 +140,34 @@ libcmis::ObjectPtr AtomObject::updateProperties( const map< string, libcmis::Pro return updated; } +libcmis::AllowableActionsPtr AtomObject::getAllowableActions( ) +{ + if ( !m_allowableActions ) + { + // For some reason we had no allowable actions before, get them now. + AtomLink* link = getLink( "http://docs.oasis-open.org/ns/cmis/link/200908/allowableactions", "application/cmisallowableactions+xml" ); + if ( link ) + { + try + { + libcmis::HttpResponsePtr response = getSession()->httpGetRequest( link->getHref() ); + string buf = response->getStream()->str(); + xmlDocPtr doc = xmlReadMemory( buf.c_str(), buf.size(), link->getHref().c_str(), NULL, 0 ); + xmlNodePtr actionsNode = xmlDocGetRootElement( doc ); + if ( actionsNode ) + m_allowableActions.reset( new libcmis::AllowableActions( actionsNode ) ); + + xmlFreeDoc( doc ); + } + catch ( libcmis::Exception& ) + { + } + } + } + + return libcmis::Object::getAllowableActions(); +} + void AtomObject::refreshImpl( xmlDocPtr doc ) throw ( libcmis::Exception ) { bool createdDoc = ( NULL == doc ); diff --git src/libcmis/atom-object.hxx src/libcmis/atom-object.hxx index 2d1761d..452b4f5 100644 --- src/libcmis/atom-object.hxx +++ src/libcmis/atom-object.hxx @@ -69,6 +69,8 @@ class AtomObject : public virtual libcmis::Object virtual libcmis::ObjectPtr updateProperties( const std::map< std::string, libcmis::PropertyPtr >& properties ) throw ( libcmis::Exception ); + virtual libcmis::AllowableActionsPtr getAllowableActions( ); + /** Reload the data from the server. */ virtual void refresh( ) throw ( libcmis::Exception ) { refreshImpl( NULL ); } -- 1.7.10.4