office-gobmx/libcmis/libcmis-0.2.3-allowable-actions.patch
Cédric Bosdonnat 478c65b490 libcmis: added a patch to workaround an alfresco bug and avoid HTTP requests
Change-Id: Ifbdaa6fce3812ff7d5c884527924b0b321133856
2012-07-03 17:08:12 +02:00

284 lines
11 KiB
Diff

diff -ur libcmis-0.2.3/src/libcmis/allowable-actions.cxx misc/build/libcmis-0.2.3/src/libcmis/allowable-actions.cxx
--- libcmis-0.2.3/src/libcmis/allowable-actions.cxx 2012-07-03 16:47:28.063183460 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/allowable-actions.cxx 2012-07-03 16:48:24.178187938 +0200
@@ -28,14 +28,122 @@
#include "allowable-actions.hxx"
#include "object.hxx"
+#include "xml-utils.hxx"
using namespace std;
namespace libcmis
{
- AllowableActions::AllowableActions( ) :
+ ObjectAction::ObjectAction( xmlNodePtr node ) :
+ m_type( ObjectAction::DeleteObject ),
+ m_enabled( false ),
+ m_valid( false )
+ {
+ try
+ {
+ m_type = parseType( string( ( char* ) node->name ) );
+ m_valid = true;
+ }
+ catch ( const Exception& e )
+ {
+ m_valid = false;
+ }
+
+ // Invalid xsd:bool will be mean false... not sure what the spec says
+ try
+ {
+ xmlChar* content = xmlNodeGetContent( node );
+ m_enabled = parseBool( string( ( char* )content ) );
+ xmlFree( content );
+ }
+ catch ( const Exception& e )
+ {
+ m_enabled = false;
+ }
+ }
+
+ ObjectAction::Type ObjectAction::parseType( string type ) throw ( Exception )
+ {
+ Type value = DeleteObject;
+ if ( type == "canDeleteObject" )
+ value = DeleteObject;
+ else if ( type == "canUpdateProperties" )
+ value = UpdateProperties;
+ else if ( type == "canGetFolderTree" )
+ value = GetFolderTree;
+ else if ( type == "canGetProperties" )
+ value = GetProperties;
+ else if ( type == "canGetObjectRelationships" )
+ value = GetObjectRelationships;
+ else if ( type == "canGetObjectParents" )
+ value = GetObjectParents;
+ else if ( type == "canGetFolderParent" )
+ value = GetFolderParent;
+ else if ( type == "canGetDescendants" )
+ value = GetDescendants;
+ else if ( type == "canMoveObject" )
+ value = MoveObject;
+ else if ( type == "canDeleteContentStream" )
+ value = DeleteContentStream;
+ else if ( type == "canCheckOut" )
+ value = CheckOut;
+ else if ( type == "canCancelCheckOut" )
+ value = CancelCheckOut;
+ else if ( type == "canCheckIn" )
+ value = CheckIn;
+ else if ( type == "canSetContentStream" )
+ value = SetContentStream;
+ else if ( type == "canGetAllVersions" )
+ value = GetAllVersions;
+ else if ( type == "canAddObjectToFolder" )
+ value = AddObjectToFolder;
+ else if ( type == "canRemoveObjectFromFolder" )
+ value = RemoveObjectFromFolder;
+ else if ( type == "canGetContentStream" )
+ value = GetContentStream;
+ else if ( type == "canApplyPolicy" )
+ value = ApplyPolicy;
+ else if ( type == "canGetAppliedPolicies" )
+ value = GetAppliedPolicies;
+ else if ( type == "canRemovePolicy" )
+ value = RemovePolicy;
+ else if ( type == "canGetChildren" )
+ value = GetChildren;
+ else if ( type == "canCreateDocument" )
+ value = CreateDocument;
+ else if ( type == "canCreateFolder" )
+ value = CreateFolder;
+ else if ( type == "canCreateRelationship" )
+ value = CreateRelationship;
+ else if ( type == "canDeleteTree" )
+ value = DeleteTree;
+ else if ( type == "canGetRenditions" )
+ value = GetRenditions;
+ else if ( type == "canGetACL" )
+ value = GetACL;
+ else if ( type == "canApplyACL" )
+ value = ApplyACL;
+ else
+ throw Exception( "Invalid AllowableAction type: " + type );
+
+ return value;
+ }
+
+ AllowableActions::AllowableActions( xmlNodePtr node ) :
m_states( )
{
+ for ( xmlNodePtr child = node->children; child; child = child->next )
+ {
+ // Check for non text children... "\n" is also a node ;)
+ if ( !xmlNodeIsText( child ) )
+ {
+ ObjectAction action( child );
+ if ( action.isValid( ) )
+ m_states.insert( pair< libcmis::ObjectAction::Type, bool >(
+ action.getType( ),
+ action.isEnabled() ) );
+ }
+ }
}
AllowableActions::AllowableActions( const AllowableActions& copy ) :
diff -ur libcmis-0.2.3/src/libcmis/allowable-actions.hxx misc/build/libcmis-0.2.3/src/libcmis/allowable-actions.hxx
--- libcmis-0.2.3/src/libcmis/allowable-actions.hxx 2012-07-03 16:47:28.018183456 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/allowable-actions.hxx 2012-07-03 16:48:24.178187938 +0200
@@ -29,6 +29,11 @@
#define _ALLOWABLE_ACTIONS_HXX_
#include <map>
+#include <string>
+
+#include <libxml/tree.h>
+
+#include "exception.hxx"
namespace libcmis
{
@@ -37,8 +42,6 @@
class ObjectAction
{
public:
- virtual ~ObjectAction( ){ }
-
enum Type
{
DeleteObject,
@@ -71,6 +74,25 @@
GetACL,
ApplyACL
};
+
+ private:
+ Type m_type;
+ bool m_enabled;
+ bool m_valid;
+
+ public:
+ ObjectAction( xmlNodePtr node );
+ virtual ~ObjectAction( ){ }
+
+ Type getType( ) { return m_type; }
+ bool isEnabled( ) { return m_enabled; }
+ bool isValid( ) { return m_valid; }
+
+ /** Parses the permission name into one of the enum values or throws
+ an exception for invalid input strings.
+ */
+ static Type parseType( std::string type ) throw ( Exception );
+
};
/** Class providing access to the allowed actions on an object.
@@ -81,7 +103,7 @@
std::map< ObjectAction::Type, bool > m_states;
public:
- AllowableActions( );
+ AllowableActions( xmlNodePtr node );
AllowableActions( const AllowableActions& copy );
virtual ~AllowableActions( );
Only in libcmis-0.2.3/src/libcmis: atom-allowable-actions.cxx
Only in libcmis-0.2.3/src/libcmis: atom-allowable-actions.hxx
diff -ur libcmis-0.2.3/src/libcmis/atom-document.hxx misc/build/libcmis-0.2.3/src/libcmis/atom-document.hxx
--- libcmis-0.2.3/src/libcmis/atom-document.hxx 2012-07-03 16:47:28.094183463 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/atom-document.hxx 2012-07-03 16:48:24.178187938 +0200
@@ -35,6 +35,7 @@
#include "document.hxx"
#include "exception.hxx"
+#include "folder.hxx"
#include "atom-object.hxx"
class AtomDocument : public libcmis::Document, public AtomObject
diff -ur libcmis-0.2.3/src/libcmis/atom-object.cxx misc/build/libcmis-0.2.3/src/libcmis/atom-object.cxx
--- libcmis-0.2.3/src/libcmis/atom-object.cxx 2012-07-03 16:47:28.095183463 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/atom-object.cxx 2012-07-03 16:48:24.179187937 +0200
@@ -435,12 +435,14 @@
// Get the infos URL as we may not have it
m_infosUrl = getLink( "self", "application/atom+xml;type=entry" )->getHref( );
- // Get the URL to the allowableActions
- AtomLink* allowableActionsLink = getLink( "http://docs.oasis-open.org/ns/cmis/link/200908/allowableactions", "application/cmisallowableactions+xml" );
- if ( NULL != allowableActionsLink )
+ // Get the allowableActions
+ xpathObj = xmlXPathEvalExpression( BAD_CAST( "//cmis:allowableActions" ), xpathCtx );
+ if ( xpathObj && xpathObj->nodesetval && xpathObj->nodesetval->nodeNr > 0 )
{
- m_allowableActions.reset( new AtomAllowableActions( m_session, allowableActionsLink->getHref( ) ) );
+ xmlNodePtr node = xpathObj->nodesetval->nodeTab[0];
+ m_allowableActions.reset( new libcmis::AllowableActions( node ) );
}
+ xmlXPathFreeObject( xpathObj );
// First get the type id as it will give us the property definitions
string typeIdReq( "//cmis:propertyId[@propertyDefinitionId='cmis:objectTypeId']/cmis:value/text()" );
diff -ur libcmis-0.2.3/src/libcmis/atom-object.hxx misc/build/libcmis-0.2.3/src/libcmis/atom-object.hxx
--- libcmis-0.2.3/src/libcmis/atom-object.hxx 2012-07-03 16:47:28.043183458 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/atom-object.hxx 2012-07-03 16:48:24.179187937 +0200
@@ -30,7 +30,7 @@
#include <libxml/tree.h>
-#include "atom-allowable-actions.hxx"
+#include "allowable-actions.hxx"
#include "object.hxx"
class AtomPubSession;
@@ -64,7 +64,7 @@
libcmis::ObjectTypePtr m_typeDescription;
std::map< std::string, libcmis::PropertyPtr > m_properties;
- boost::shared_ptr< AtomAllowableActions > m_allowableActions;
+ boost::shared_ptr< libcmis::AllowableActions > m_allowableActions;
std::vector< AtomLink > m_links;
diff -ur libcmis-0.2.3/src/libcmis/atom-session.cxx misc/build/libcmis-0.2.3/src/libcmis/atom-session.cxx
--- libcmis-0.2.3/src/libcmis/atom-session.cxx 2012-07-03 16:47:27.989183454 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/atom-session.cxx 2012-07-03 16:48:24.179187937 +0200
@@ -311,6 +311,7 @@
string pattern = getWorkspace().getUriTemplate( atom::UriTemplate::ObjectById );
map< string, string > vars;
vars[URI_TEMPLATE_VAR_ID] = id;
+ vars[string( "includeAllowableActions" )] = string( "true" );
string url = createUrl( pattern, vars );
try
@@ -340,6 +341,7 @@
string pattern = getWorkspace().getUriTemplate( atom::UriTemplate::ObjectByPath );
map< string, string > vars;
vars[URI_TEMPLATE_VAR_PATH] = path;
+ vars[string( "includeAllowableActions" )] = string( "true" );
string url = createUrl( pattern, vars );
try
diff -ur libcmis-0.2.3/src/libcmis/Makefile.am misc/build/libcmis-0.2.3/src/libcmis/Makefile.am
--- libcmis-0.2.3/src/libcmis/Makefile.am 2012-07-03 16:47:28.021183457 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/Makefile.am 2012-07-03 16:48:24.177187939 +0200
@@ -32,8 +32,6 @@
atom-utils.cxx \
atom-workspace.hxx \
atom-workspace.cxx \
- atom-allowable-actions.hxx \
- atom-allowable-actions.cxx \
allowable-actions.cxx \
property.cxx \
property-type.cxx \
diff -ur libcmis-0.2.3/src/libcmis/makefile.mk misc/build/libcmis-0.2.3/src/libcmis/makefile.mk
--- libcmis-0.2.3/src/libcmis/makefile.mk 2012-07-03 16:47:28.052183459 +0200
+++ misc/build/libcmis-0.2.3/src/libcmis/makefile.mk 2012-07-03 16:48:24.179187937 +0200
@@ -25,7 +25,6 @@
SLOFILES= \
$(SLO)$/allowable-actions.obj \
- $(SLO)$/atom-allowable-actions.obj \
$(SLO)$/atom-document.obj \
$(SLO)$/atom-folder.obj \
$(SLO)$/atom-object-type.obj \