1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_fpicker.hxx" 26*b1cdbd2cSJim Jagielski #include "fpsmartcontent.hxx" 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 29*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/ContentInfo.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/ContentInfoAttribute.hpp> 32*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XContent.hpp> 33*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx> 36*b1cdbd2cSJim Jagielski #include <ucbhelper/commandenvironment.hxx> 37*b1cdbd2cSJim Jagielski #include <tools/solar.h> 38*b1cdbd2cSJim Jagielski #include <tools/debug.hxx> 39*b1cdbd2cSJim Jagielski #include <tools/string.hxx> 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski //........................................................................ 42*b1cdbd2cSJim Jagielski namespace svt 43*b1cdbd2cSJim Jagielski { 44*b1cdbd2cSJim Jagielski //........................................................................ 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; 47*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::task; 48*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ucb; 49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang; 50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski //==================================================================== 53*b1cdbd2cSJim Jagielski //= SmartContent 54*b1cdbd2cSJim Jagielski //==================================================================== 55*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- SmartContent()56*b1cdbd2cSJim Jagielski SmartContent::SmartContent() 57*b1cdbd2cSJim Jagielski :m_pContent( NULL ) 58*b1cdbd2cSJim Jagielski ,m_eState( NOT_BOUND ) 59*b1cdbd2cSJim Jagielski ,m_pOwnInteraction( NULL ) 60*b1cdbd2cSJim Jagielski { 61*b1cdbd2cSJim Jagielski } 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- SmartContent(const::rtl::OUString & _rInitialURL)64*b1cdbd2cSJim Jagielski SmartContent::SmartContent( const ::rtl::OUString& _rInitialURL ) 65*b1cdbd2cSJim Jagielski :m_pContent( NULL ) 66*b1cdbd2cSJim Jagielski ,m_eState( NOT_BOUND ) 67*b1cdbd2cSJim Jagielski { 68*b1cdbd2cSJim Jagielski bindTo( _rInitialURL ); 69*b1cdbd2cSJim Jagielski } 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ~SmartContent()72*b1cdbd2cSJim Jagielski SmartContent::~SmartContent() 73*b1cdbd2cSJim Jagielski { 74*b1cdbd2cSJim Jagielski //Do not delete the content. Because the content will be used by the cache. 75*b1cdbd2cSJim Jagielski //DELETEZ( m_pContent ); 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- enableOwnInteractionHandler(::svt::OFilePickerInteractionHandler::EInterceptedInteractions eInterceptions)79*b1cdbd2cSJim Jagielski void SmartContent::enableOwnInteractionHandler(::svt::OFilePickerInteractionHandler::EInterceptedInteractions eInterceptions) 80*b1cdbd2cSJim Jagielski { 81*b1cdbd2cSJim Jagielski Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory(); 82*b1cdbd2cSJim Jagielski Reference< XInteractionHandler > xGlobalInteractionHandler = Reference< XInteractionHandler >( 83*b1cdbd2cSJim Jagielski xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), UNO_QUERY ); 84*b1cdbd2cSJim Jagielski 85*b1cdbd2cSJim Jagielski m_pOwnInteraction = new ::svt::OFilePickerInteractionHandler(xGlobalInteractionHandler); 86*b1cdbd2cSJim Jagielski m_pOwnInteraction->enableInterceptions(eInterceptions); 87*b1cdbd2cSJim Jagielski m_xOwnInteraction = m_pOwnInteraction; 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski m_xCmdEnv = new ::ucbhelper::CommandEnvironment( m_xOwnInteraction, Reference< XProgressHandler >() ); 90*b1cdbd2cSJim Jagielski } 91*b1cdbd2cSJim Jagielski 92*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- enableDefaultInteractionHandler()93*b1cdbd2cSJim Jagielski void SmartContent::enableDefaultInteractionHandler() 94*b1cdbd2cSJim Jagielski { 95*b1cdbd2cSJim Jagielski // Don't free the memory here! It will be done by the next 96*b1cdbd2cSJim Jagielski // call automaticly - releasing of the uno reference ... 97*b1cdbd2cSJim Jagielski m_pOwnInteraction = NULL; 98*b1cdbd2cSJim Jagielski m_xOwnInteraction = Reference< XInteractionHandler >(); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory(); 101*b1cdbd2cSJim Jagielski Reference< XInteractionHandler > xGlobalInteractionHandler = Reference< XInteractionHandler >( 102*b1cdbd2cSJim Jagielski xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") ) ), UNO_QUERY ); 103*b1cdbd2cSJim Jagielski m_xCmdEnv = new ucbhelper::CommandEnvironment( xGlobalInteractionHandler, Reference< XProgressHandler >() ); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getOwnInteractionHandler() const107*b1cdbd2cSJim Jagielski ::svt::OFilePickerInteractionHandler* SmartContent::getOwnInteractionHandler() const 108*b1cdbd2cSJim Jagielski { 109*b1cdbd2cSJim Jagielski if (!m_xOwnInteraction.is()) 110*b1cdbd2cSJim Jagielski return NULL; 111*b1cdbd2cSJim Jagielski return m_pOwnInteraction; 112*b1cdbd2cSJim Jagielski } 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- queryCurrentInteractionHandler() const115*b1cdbd2cSJim Jagielski SmartContent::InteractionHandlerType SmartContent::queryCurrentInteractionHandler() const 116*b1cdbd2cSJim Jagielski { 117*b1cdbd2cSJim Jagielski if (m_xOwnInteraction.is()) 118*b1cdbd2cSJim Jagielski return IHT_OWN; 119*b1cdbd2cSJim Jagielski 120*b1cdbd2cSJim Jagielski if (!m_xCmdEnv.is()) 121*b1cdbd2cSJim Jagielski return IHT_NONE; 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski return IHT_DEFAULT; 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- disableInteractionHandler()127*b1cdbd2cSJim Jagielski void SmartContent::disableInteractionHandler() 128*b1cdbd2cSJim Jagielski { 129*b1cdbd2cSJim Jagielski // Don't free the memory here! It will be done by the next 130*b1cdbd2cSJim Jagielski // call automaticly - releasing of the uno reference ... 131*b1cdbd2cSJim Jagielski m_pOwnInteraction = NULL; 132*b1cdbd2cSJim Jagielski m_xOwnInteraction.clear(); 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski m_xCmdEnv.clear(); 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- bindTo(const::rtl::OUString & _rURL)138*b1cdbd2cSJim Jagielski void SmartContent::bindTo( const ::rtl::OUString& _rURL ) 139*b1cdbd2cSJim Jagielski { 140*b1cdbd2cSJim Jagielski if ( getURL() == _rURL ) 141*b1cdbd2cSJim Jagielski // nothing to do, regardless of the state 142*b1cdbd2cSJim Jagielski return; 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski DELETEZ( m_pContent ); 145*b1cdbd2cSJim Jagielski m_eState = INVALID; // default to INVALID 146*b1cdbd2cSJim Jagielski m_sURL = _rURL; 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski if ( m_sURL.getLength() ) 149*b1cdbd2cSJim Jagielski { 150*b1cdbd2cSJim Jagielski try 151*b1cdbd2cSJim Jagielski { 152*b1cdbd2cSJim Jagielski m_pContent = new ::ucbhelper::Content( _rURL, m_xCmdEnv ); 153*b1cdbd2cSJim Jagielski m_eState = UNKNOWN; 154*b1cdbd2cSJim Jagielski // from now on, the state is unknown -> we cannot know for sure if the content 155*b1cdbd2cSJim Jagielski // is really valid (some UCP's only tell this when asking for properties, not upon 156*b1cdbd2cSJim Jagielski // creation) 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski catch( ContentCreationException& ) 159*b1cdbd2cSJim Jagielski { 160*b1cdbd2cSJim Jagielski } 161*b1cdbd2cSJim Jagielski catch( Exception& ) 162*b1cdbd2cSJim Jagielski { 163*b1cdbd2cSJim Jagielski DBG_ERROR( "SmartContent::bindTo: unexpected exception caught!" ); 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski } 166*b1cdbd2cSJim Jagielski else 167*b1cdbd2cSJim Jagielski { 168*b1cdbd2cSJim Jagielski m_eState = NOT_BOUND; 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski // don't forget to reset the may internal used interaction handler ... 173*b1cdbd2cSJim Jagielski // But do it only for our own specialized interaction helper! 174*b1cdbd2cSJim Jagielski ::svt::OFilePickerInteractionHandler* pHandler = getOwnInteractionHandler(); 175*b1cdbd2cSJim Jagielski if (pHandler) 176*b1cdbd2cSJim Jagielski { 177*b1cdbd2cSJim Jagielski pHandler->resetUseState(); 178*b1cdbd2cSJim Jagielski pHandler->forgetRequest(); 179*b1cdbd2cSJim Jagielski } 180*b1cdbd2cSJim Jagielski } 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- implIs(const::rtl::OUString & _rURL,Type _eType)183*b1cdbd2cSJim Jagielski sal_Bool SmartContent::implIs( const ::rtl::OUString& _rURL, Type _eType ) 184*b1cdbd2cSJim Jagielski { 185*b1cdbd2cSJim Jagielski // bind to this content 186*b1cdbd2cSJim Jagielski bindTo( _rURL ); 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski // did we survive this? 189*b1cdbd2cSJim Jagielski if ( isInvalid() || !isBound() ) 190*b1cdbd2cSJim Jagielski return sal_False; 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski DBG_ASSERT( m_pContent, "SmartContent::implIs: inconsistence!" ); 193*b1cdbd2cSJim Jagielski // if, after an bindTo, we don't have a content, then we should be INVALID, or at least 194*b1cdbd2cSJim Jagielski // NOT_BOUND (the latter happens, for example, if somebody tries to ask for an empty URL) 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski sal_Bool bIs = sal_False; 197*b1cdbd2cSJim Jagielski try 198*b1cdbd2cSJim Jagielski { 199*b1cdbd2cSJim Jagielski if ( Folder == _eType ) 200*b1cdbd2cSJim Jagielski bIs = m_pContent->isFolder(); 201*b1cdbd2cSJim Jagielski else 202*b1cdbd2cSJim Jagielski bIs = m_pContent->isDocument(); 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski // from here on, we definately know that the content is valid 205*b1cdbd2cSJim Jagielski m_eState = VALID; 206*b1cdbd2cSJim Jagielski } 207*b1cdbd2cSJim Jagielski catch( Exception& ) 208*b1cdbd2cSJim Jagielski { 209*b1cdbd2cSJim Jagielski // now we're definately invalid 210*b1cdbd2cSJim Jagielski m_eState = INVALID; 211*b1cdbd2cSJim Jagielski } 212*b1cdbd2cSJim Jagielski return bIs; 213*b1cdbd2cSJim Jagielski } 214*b1cdbd2cSJim Jagielski 215*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getTitle(::rtl::OUString & _rTitle)216*b1cdbd2cSJim Jagielski void SmartContent::getTitle( ::rtl::OUString& /* [out] */ _rTitle ) 217*b1cdbd2cSJim Jagielski { 218*b1cdbd2cSJim Jagielski if ( !isBound() || isInvalid() ) 219*b1cdbd2cSJim Jagielski return; 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski try 222*b1cdbd2cSJim Jagielski { 223*b1cdbd2cSJim Jagielski ::rtl::OUString sTitle; 224*b1cdbd2cSJim Jagielski m_pContent->getPropertyValue( ::rtl::OUString::createFromAscii( "Title" ) ) >>= sTitle; 225*b1cdbd2cSJim Jagielski _rTitle = sTitle; 226*b1cdbd2cSJim Jagielski 227*b1cdbd2cSJim Jagielski // from here on, we definately know that the content is valid 228*b1cdbd2cSJim Jagielski m_eState = VALID; 229*b1cdbd2cSJim Jagielski } 230*b1cdbd2cSJim Jagielski catch( ::com::sun::star::uno::Exception& ) 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski // now we're definately invalid 233*b1cdbd2cSJim Jagielski m_eState = INVALID; 234*b1cdbd2cSJim Jagielski } 235*b1cdbd2cSJim Jagielski } 236*b1cdbd2cSJim Jagielski 237*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- hasParentFolder()238*b1cdbd2cSJim Jagielski sal_Bool SmartContent::hasParentFolder( ) 239*b1cdbd2cSJim Jagielski { 240*b1cdbd2cSJim Jagielski if ( !isBound() || isInvalid() ) 241*b1cdbd2cSJim Jagielski return sal_False; 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski sal_Bool bRet = sal_False; 244*b1cdbd2cSJim Jagielski try 245*b1cdbd2cSJim Jagielski { 246*b1cdbd2cSJim Jagielski Reference< XChild > xChild( m_pContent->get(), UNO_QUERY ); 247*b1cdbd2cSJim Jagielski if ( xChild.is() ) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski Reference< XContent > xParent( xChild->getParent(), UNO_QUERY ); 250*b1cdbd2cSJim Jagielski if ( xParent.is() ) 251*b1cdbd2cSJim Jagielski { 252*b1cdbd2cSJim Jagielski String aParentURL = String( xParent->getIdentifier()->getContentIdentifier() ); 253*b1cdbd2cSJim Jagielski bRet = ( aParentURL.Len() > 0 && aParentURL != (String)(m_pContent->getURL()) ); 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski // now we're definately valid 256*b1cdbd2cSJim Jagielski m_eState = VALID; 257*b1cdbd2cSJim Jagielski } 258*b1cdbd2cSJim Jagielski } 259*b1cdbd2cSJim Jagielski } 260*b1cdbd2cSJim Jagielski catch( const Exception& ) 261*b1cdbd2cSJim Jagielski { 262*b1cdbd2cSJim Jagielski // now we're definately invalid 263*b1cdbd2cSJim Jagielski m_eState = INVALID; 264*b1cdbd2cSJim Jagielski } 265*b1cdbd2cSJim Jagielski return bRet; 266*b1cdbd2cSJim Jagielski } 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- canCreateFolder()269*b1cdbd2cSJim Jagielski sal_Bool SmartContent::canCreateFolder( ) 270*b1cdbd2cSJim Jagielski { 271*b1cdbd2cSJim Jagielski if ( !isBound() || isInvalid() ) 272*b1cdbd2cSJim Jagielski return sal_False; 273*b1cdbd2cSJim Jagielski 274*b1cdbd2cSJim Jagielski sal_Bool bRet = sal_False; 275*b1cdbd2cSJim Jagielski try 276*b1cdbd2cSJim Jagielski { 277*b1cdbd2cSJim Jagielski Sequence< ContentInfo > aInfo = m_pContent->queryCreatableContentsInfo(); 278*b1cdbd2cSJim Jagielski const ContentInfo* pInfo = aInfo.getConstArray(); 279*b1cdbd2cSJim Jagielski sal_Int32 nCount = aInfo.getLength(); 280*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0; i < nCount; ++i, ++pInfo ) 281*b1cdbd2cSJim Jagielski { 282*b1cdbd2cSJim Jagielski // Simply look for the first KIND_FOLDER... 283*b1cdbd2cSJim Jagielski if ( pInfo->Attributes & ContentInfoAttribute::KIND_FOLDER ) 284*b1cdbd2cSJim Jagielski { 285*b1cdbd2cSJim Jagielski bRet = sal_True; 286*b1cdbd2cSJim Jagielski break; 287*b1cdbd2cSJim Jagielski } 288*b1cdbd2cSJim Jagielski } 289*b1cdbd2cSJim Jagielski 290*b1cdbd2cSJim Jagielski // now we're definately valid 291*b1cdbd2cSJim Jagielski m_eState = VALID; 292*b1cdbd2cSJim Jagielski } 293*b1cdbd2cSJim Jagielski catch( Exception& ) 294*b1cdbd2cSJim Jagielski { 295*b1cdbd2cSJim Jagielski // now we're definately invalid 296*b1cdbd2cSJim Jagielski m_eState = INVALID; 297*b1cdbd2cSJim Jagielski } 298*b1cdbd2cSJim Jagielski return bRet; 299*b1cdbd2cSJim Jagielski } 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski //........................................................................ 302*b1cdbd2cSJim Jagielski } // namespace svt 303*b1cdbd2cSJim Jagielski //........................................................................ 304*b1cdbd2cSJim Jagielski 305