diff -r 000000000000 -r 7f656887cf89 commands/fed/src/bufferbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commands/fed/src/bufferbase.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,217 @@ +// bufferbase.cpp +// +// Copyright (c) 2009 - 2010 Accenture. All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Accenture - Initial contribution +// +#include "bufferbase.h" +#include "filebuffer.h" // for CFileBlock::CountNewLines + +CFedBufferBase::CFedBufferBase() + : CActive(EPriorityStandard), iRefCount(1) + { + } + +TInt CFedBufferBase::RefCount() const + { + return iRefCount; + } + +void CFedBufferBase::IncRef() + { + iRefCount++; + } + +TInt CFedBufferBase::DecRef() + { + iRefCount--; + TInt refCount = iRefCount; + if (refCount == 0) delete this; + return refCount; + } + +void StaticDecRef(TAny* aPtr) + { + static_cast(aPtr)->DecRef(); + } + +void CFedBufferBase::PushL() + { + CleanupStack::PushL(TCleanupItem(&StaticDecRef, this)); + } + +void CFedBufferBase::DoCancel() + { + ASSERT(EFalse); + } + +void CFedBufferBase::RunL() + { + ASSERT(EFalse); + } + +TInt CFedBufferBase::FindClientRequest(MSharedCacheClient& aClient) + { + TPtrC dummy; + TRange dummyRange; + TInt dummyLine; + return iClientRequests.FindInUnsignedKeyOrder(TClientRequest(&aClient, dummy, dummyRange, dummyLine)); + } + +TInt CFedBufferBase::RegisterClient(MSharedCacheClient& aClient, TPtrC& aDes, TRange& aRange, TInt& aRangeStartLineNumber) + { + TInt err = iClientRequests.InsertInUnsignedKeyOrder(TClientRequest(&aClient, aDes, aRange, aRangeStartLineNumber)); + return err; + } + +void CFedBufferBase::UnregisterClient(MSharedCacheClient& aClient) + { + TInt res = FindClientRequest(aClient); + if (res >= 0) iClientRequests.Remove(res); + } + +CFedBufferBase::~CFedBufferBase() + { + ASSERT(iRefCount == 0); // Otherwise someone has deleted us directly rather than going through the reference counting + iClientRequests.Reset(); + } + +void CFedBufferBase::InsertTextL(TInt /*aDocumentPosition*/, const TDesC& /*aText*/) + { + User::Leave(KErrNotSupported); + } + +void CFedBufferBase::DeleteTextL(TRange /*aRange*/) + { + User::Leave(KErrNotSupported); + } + +void CFedBufferBase::SaveL(const TDesC& /*aNewName*/, TBool /*aReplace*/) + { + User::Leave(KErrNotSupported); + } + +TBool CFedBufferBase::Modified() const + { + return EFalse; + } + +TBool CFedBufferBase::Editable() const + { + return EFalse; + } + +TBool CFedBufferBase::IsOpen() const + { + return EFalse; + } + +/////// + +CConstDataBuffer::CConstDataBuffer(const TDesC& aTitle, const TDesC& aText) +: iTitle(aTitle), iText(aText) + { + } + +CConstDataBuffer::CConstDataBuffer(const TDesC& aTitle, HBufC* aTextPtr) + : iTitle(aTitle), iText(*aTextPtr), iOwnedTextPtr(aTextPtr) + { + } + +CConstDataBuffer::~CConstDataBuffer() + { + delete iOwnedTextPtr; + } + +const TDesC& CConstDataBuffer::Title() const + { + return iTitle; + } + +TDelimiterType CConstDataBuffer::DelimiterType() const + { + return EDelimLF; + } + +TEncodingType CConstDataBuffer::Encoding() const + { + return EEncodingUtf16Native; + } + +TInt CConstDataBuffer::GetData(MSharedCacheClient& aClient, TInt aDocumentPosition) + { + TInt idx = FindClientRequest(aClient); + if (idx < 0) + { + return idx; + } + + TClientRequest& client = iClientRequests[idx]; + ASSERT(aDocumentPosition >= 0); + + client.iRange = TRange(aDocumentPosition, iText.Length()-aDocumentPosition); + client.iDes.Set(iText.Mid(aDocumentPosition)); + TInt lines = KMaxTInt; + CFileBlock::CountNewLines(iText.Left(aDocumentPosition), lines, KMaxTInt); + client.iRangeStartLineNumber = lines; + return KErrNone; + } + +TInt CConstDataBuffer::SeekFromOffset(MSharedCacheClient& aClient, TInt aOffset, TInt aNumLinesFromOffset, TInt aLineLength) + { + TInt idx = FindClientRequest(aClient); + if (idx < 0) + { + return idx; + } + TClientRequest& client = iClientRequests[idx]; + + TInt lineDelta = aNumLinesFromOffset; + TInt bufPos = -1; + if (lineDelta > 0) + { + TPtrC ptr = iText.Mid(aOffset); + bufPos = CFileBlock::CountNewLines(ptr, lineDelta, aLineLength); + if (bufPos == KErrNotFound) + { + aOffset = 0; + ptr.Set(iText); + lineDelta = -1; + bufPos = CFileBlock::CountNewLines(ptr, lineDelta, aLineLength); + } + } + else + { + lineDelta--; + TPtrC ptr = iText.Left(aOffset); + aOffset = 0; + bufPos = CFileBlock::CountNewLines(ptr, lineDelta, aLineLength); + if (bufPos == KErrNotFound) bufPos = 0; + } + + + client.iDes.Set(iText.Mid(bufPos+aOffset)); + client.iRange = TRange(bufPos + aOffset, client.iDes.Length()); + TInt lines = KMaxTInt; + CFileBlock::CountNewLines(iText.Left(bufPos + aOffset), lines, KMaxTInt); + client.iRangeStartLineNumber = lines; + return KErrNone; + } + +TBool CConstDataBuffer::DocumentPositionIsEof(TInt aDocumentPosition) const + { + return (aDocumentPosition == iText.Length()); + } + +TInt CConstDataBuffer::Find(TInt aStartingPosition, const TDesC& aSearchString, TBool aBackwards) + { + ASSERT(!aBackwards); + TInt res = iText.Mid(aStartingPosition).Find(aSearchString); + if (res >= 0) res += aStartingPosition; + return res; + }