diff options
Diffstat (limited to 'src/libcmis/ws-document.cxx')
-rw-r--r-- | src/libcmis/ws-document.cxx | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/libcmis/ws-document.cxx b/src/libcmis/ws-document.cxx new file mode 100644 index 0000000..ba2f2bc --- /dev/null +++ b/src/libcmis/ws-document.cxx @@ -0,0 +1,135 @@ +/* libcmis + * Version: MPL 1.1 / GPLv2+ / LGPLv2+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * Copyright (C) 2011 SUSE <cbosdonnat@suse.com> + * + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPLv2+"), or + * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"), + * in which case the provisions of the GPLv2+ or the LGPLv2+ are applicable + * instead of those above. + */ + +#include "ws-document.hxx" + +using namespace std; +using libcmis::PropertyPtrMap; + +WSDocument::WSDocument( const WSObject& object ) : + libcmis::Object( object ), + libcmis::Document( const_cast< WSObject& >( object ).getSession( ) ), + WSObject( object ) +{ +} + +WSDocument::~WSDocument( ) +{ +} + +vector< libcmis::FolderPtr > WSDocument::getParents( ) +{ + string repoId = getSession( )->getRepositoryId( ); + return getSession( )->getNavigationService( ).getObjectParents( repoId, getId( ) ); +} + +boost::shared_ptr< istream > WSDocument::getContentStream( std::string /* streamId */ ) +{ + string repoId = getSession( )->getRepositoryId( ); + return getSession( )->getObjectService( ).getContentStream( repoId, getId( ) ); +} + +void WSDocument::setContentStream( boost::shared_ptr< ostream > os, string contentType, + string fileName, bool overwrite ) +{ + string repoId = getSession( )->getRepositoryId( ); + getSession( )->getObjectService( ).setContentStream( repoId, getId( ), + overwrite, getChangeToken( ), os, contentType, fileName ); + + refresh( ); +} + +libcmis::DocumentPtr WSDocument::checkOut( ) +{ + string repoId = getSession( )->getRepositoryId( ); + return getSession( )->getVersioningService( ).checkOut( repoId, getId( ) ); +} + +void WSDocument::cancelCheckout( ) +{ + string repoId = getSession( )->getRepositoryId( ); + getSession( )->getVersioningService( ).cancelCheckOut( repoId, getId( ) ); +} + +libcmis::DocumentPtr WSDocument::checkIn( bool isMajor, string comment, + const PropertyPtrMap& properties, + boost::shared_ptr< ostream > stream, + string contentType, string fileName ) +{ + string repoId = getSession( )->getRepositoryId( ); + libcmis::DocumentPtr newVersion; + + // Try the normal request first, but if we have a server error, we may want to resend it + // without the stream as SharePoint wants no stream in the request, but gets the one from + // the PWC see the following discussion: + // http://social.technet.microsoft.com/Forums/eu/sharepoint2010programming/thread/b30e4d82-5b7e-4ceb-b9ad-c6f0d4c59d11 + bool tryNoStream = false; + try + { + newVersion = getSession( )->getVersioningService( ).checkIn( repoId, getId( ), + isMajor, properties, stream, contentType, fileName, comment ); + } + catch ( const libcmis::Exception& e ) + { + string spError( "Object reference not set to an instance of an object" ); + if ( string( e.what( ) ).find( spError ) != string::npos ) + tryNoStream = true; + else + throw; + } + + if ( tryNoStream ) + { + // Set the content stream first + setContentStream( stream, contentType, fileName ); + + // Then check-in + boost::shared_ptr< ostream > nostream; + newVersion = getSession( )->getVersioningService( ).checkIn( repoId, getId( ), + isMajor, properties, nostream, string( ), string( ), comment ); + } + + if ( newVersion->getId( ) == getId( ) ) + refresh( ); + + return newVersion; +} + +vector< libcmis::DocumentPtr > WSDocument::getAllVersions( ) +{ + vector< libcmis::DocumentPtr > versions; + string repoId = getSession( )->getRepositoryId( ); + string versionSeries; + PropertyPtrMap::const_iterator it = getProperties( ).find( string( "cmis:versionSeriesId" ) ); + if ( it != getProperties( ).end( ) && !it->second->getStrings( ).empty( ) ) + { + versionSeries = it->second->getStrings( ).front( ); + versions = getSession( )->getVersioningService( ).getAllVersions( repoId, versionSeries ); + } + return versions; +} |