/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include #include #include #include #include "../events/mutationevent.hxx" namespace DOM { CCharacterData::CCharacterData( CDocument const& rDocument, ::osl::Mutex const& rMutex, NodeType const& reNodeType, xmlNodePtr const& rpNode) : CCharacterData_Base(rDocument, rMutex, reNodeType, rpNode) { } void CCharacterData::dispatchEvent_Impl( OUString const& prevValue, OUString const& newValue) { Reference< XDocumentEvent > docevent(getOwnerDocument(), UNO_QUERY); Reference< XMutationEvent > event(docevent->createEvent( OUString::createFromAscii("DOMCharacterDataModified")), UNO_QUERY); event->initMutationEvent( OUString::createFromAscii("DOMCharacterDataModified"), sal_True, sal_False, Reference< XNode >(), prevValue, newValue, OUString(), (AttrChangeType)0 ); dispatchEvent(Reference< XEvent >(event, UNO_QUERY)); dispatchSubtreeModified(); } /** Append the string to the end of the character data of the node. */ void SAL_CALL CCharacterData::appendData(const OUString& arg) throw (RuntimeException, DOMException) { ::osl::ClearableMutexGuard guard(m_rMutex); if (m_aNodePtr != NULL) { OUString oldValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); xmlNodeAddContent(m_aNodePtr, (const xmlChar*)(OUStringToOString(arg, RTL_TEXTENCODING_UTF8).getStr())); OUString newValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); guard.clear(); // release mutex before calling event handlers dispatchEvent_Impl(oldValue, newValue); } } /** Remove a range of 16-bit units from the node. */ void SAL_CALL CCharacterData::deleteData(sal_Int32 offset, sal_Int32 count) throw (RuntimeException, DOMException) { ::osl::ClearableMutexGuard guard(m_rMutex); if (m_aNodePtr != NULL) { // get current data ::boost::shared_ptr const pContent( xmlNodeGetContent(m_aNodePtr), xmlFree); OString aData(reinterpret_cast(pContent.get())); OUString tmp( aData.getStr(), aData.getLength(), RTL_TEXTENCODING_UTF8); if (offset > tmp.getLength() || offset < 0 || count < 0) { DOMException e; e.Code = DOMExceptionType_INDEX_SIZE_ERR; throw e; } if ((offset+count) > tmp.getLength()) count = tmp.getLength() - offset; OUString tmp2 = tmp.copy(0, offset); tmp2 += tmp.copy(offset+count, tmp.getLength() - (offset+count)); OUString oldValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); xmlNodeSetContent(m_aNodePtr, (const xmlChar*)(OUStringToOString(tmp2, RTL_TEXTENCODING_UTF8).getStr())); OUString newValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); guard.clear(); // release mutex before calling event handlers dispatchEvent_Impl(oldValue, newValue); } } /** Return the character data of the node that implements this interface. */ OUString SAL_CALL CCharacterData::getData() throw (RuntimeException) { ::osl::MutexGuard const g(m_rMutex); OUString aData; if (m_aNodePtr != NULL) { OSL_ENSURE(m_aNodePtr->content, "character data node with NULL content, please inform lars.oppermann@sun.com!"); if (m_aNodePtr->content != NULL) { aData = OUString((const sal_Char*)m_aNodePtr->content, strlen((const sal_Char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); } } return aData; } /** The number of 16-bit units that are available through data and the substringData method below. */ sal_Int32 SAL_CALL CCharacterData::getLength() throw (RuntimeException) { ::osl::MutexGuard const g(m_rMutex); sal_Int32 length = 0; if (m_aNodePtr != NULL) { OUString aData((const sal_Char*)m_aNodePtr->content, strlen((const sal_Char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); length = aData.getLength(); } return length; } /** Insert a string at the specified 16-bit unit offset. */ void SAL_CALL CCharacterData::insertData(sal_Int32 offset, const OUString& arg) throw (RuntimeException, DOMException) { ::osl::ClearableMutexGuard guard(m_rMutex); if (m_aNodePtr != NULL) { // get current data ::boost::shared_ptr const pContent( xmlNodeGetContent(m_aNodePtr), xmlFree); OString aData(reinterpret_cast(pContent.get())); OUString tmp( aData.getStr(), aData.getLength(), RTL_TEXTENCODING_UTF8); if (offset > tmp.getLength() || offset < 0) { DOMException e; e.Code = DOMExceptionType_INDEX_SIZE_ERR; throw e; } OUString tmp2 = tmp.copy(0, offset); tmp2 += arg; tmp2 += tmp.copy(offset, tmp.getLength() - offset); OUString oldValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); xmlNodeSetContent(m_aNodePtr, (const xmlChar*)(OUStringToOString(tmp2, RTL_TEXTENCODING_UTF8).getStr())); OUString newValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); guard.clear(); // release mutex before calling event handlers dispatchEvent_Impl(oldValue, newValue); } } /** Replace the characters starting at the specified 16-bit unit offset with the specified string. */ void SAL_CALL CCharacterData::replaceData(sal_Int32 offset, sal_Int32 count, const OUString& arg) throw (RuntimeException, DOMException) { ::osl::ClearableMutexGuard guard(m_rMutex); if (m_aNodePtr != NULL) { // get current data ::boost::shared_ptr const pContent( xmlNodeGetContent(m_aNodePtr), xmlFree); OString aData(reinterpret_cast(pContent.get())); OUString tmp( aData.getStr(), aData.getLength(), RTL_TEXTENCODING_UTF8); if (offset > tmp.getLength() || offset < 0 || count < 0){ DOMException e; e.Code = DOMExceptionType_INDEX_SIZE_ERR; throw e; } if ((offset+count) > tmp.getLength()) count = tmp.getLength() - offset; OUString tmp2 = tmp.copy(0, offset); tmp2 += arg; tmp2 += tmp.copy(offset+count, tmp.getLength() - (offset+count)); OUString oldValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); xmlNodeSetContent(m_aNodePtr, (const xmlChar*)(OUStringToOString(tmp2, RTL_TEXTENCODING_UTF8).getStr())); OUString newValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); guard.clear(); // release mutex before calling event handlers dispatchEvent_Impl(oldValue, newValue); } } /** Set the character data of the node that implements this interface. */ void SAL_CALL CCharacterData::setData(const OUString& data) throw (RuntimeException, DOMException) { ::osl::ClearableMutexGuard guard(m_rMutex); if (m_aNodePtr != NULL) { OUString oldValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); xmlNodeSetContent(m_aNodePtr, (const xmlChar*)(OUStringToOString(data, RTL_TEXTENCODING_UTF8).getStr())); OUString newValue((char*)m_aNodePtr->content, strlen((char*)m_aNodePtr->content), RTL_TEXTENCODING_UTF8); guard.clear(); // release mutex before calling event handlers dispatchEvent_Impl(oldValue, newValue); } } /** Extracts a range of data from the node. */ OUString SAL_CALL CCharacterData::subStringData(sal_Int32 offset, sal_Int32 count) throw (RuntimeException, DOMException) { ::osl::MutexGuard const g(m_rMutex); OUString aStr; if (m_aNodePtr != NULL) { // get current data ::boost::shared_ptr const pContent( xmlNodeGetContent(m_aNodePtr), xmlFree); OString aData(reinterpret_cast(pContent.get())); OUString tmp( aData.getStr(), aData.getLength(), RTL_TEXTENCODING_UTF8); if (offset > tmp.getLength() || offset < 0 || count < 0) { DOMException e; e.Code = DOMExceptionType_INDEX_SIZE_ERR; throw e; } aStr = tmp.copy(offset, count); } return aStr; } } // namspace DOM