diff -r 000000000000 -r 7f85d04be362 upnpframework/upnpcommand/src/upnpfilepipe.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpframework/upnpcommand/src/upnpfilepipe.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,194 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Source file for CUpnpFilePipe class. +* +*/ + + +// INCLUDE FILES +#include "upnpfilepipe.h" + +_LIT( KComponentLogfile, "upnpcommand.log"); +#include "upnplog.h" + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::NewL +// Creates a new file pipe with unlimited length. +// -------------------------------------------------------------------------- +// +CUpnpFilePipe* CUpnpFilePipe::NewL() + { + __LOG( "[UpnpCommand]\t CUpnpFilePipe::NewL" ); + + // Create a new file pipe with unlimited length (0). + return new (ELeave) CUpnpFilePipe( 0 ); + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::NewL +// Creates a new file pipe with a set length. +// -------------------------------------------------------------------------- +// +CUpnpFilePipe* CUpnpFilePipe::NewL( TInt aMaxSize ) + { + __LOG( "[UpnpCommand]\t CUpnpFilePipe::NewL" ); + + // Check param + if( aMaxSize <= 0 ) + { + User::Leave( KErrArgument ); + } + + // Create a new file pipe with the given length. + return new (ELeave) CUpnpFilePipe( aMaxSize ); + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::CUpnpFilePipe +// First phase construction. +// -------------------------------------------------------------------------- +// +CUpnpFilePipe::CUpnpFilePipe( TInt aMaxSize ) + : iMaxSize( aMaxSize ) + { + // No implementation + } + +// -------------------------------------------------------------------------- +// Destructor. +// -------------------------------------------------------------------------- +// +CUpnpFilePipe::~CUpnpFilePipe() + { + __LOG( "[UpnpCommand]\t CUpnpFilePipe::Destructor" ); + + // Reset the content of the array + Reset(); + + // Close the array + iValues.Close(); + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::PushL +// Pushes one file into the pipe. +// -------------------------------------------------------------------------- +// +void CUpnpFilePipe::PushL( const TDesC& aParam ) + { + __LOG( "[UpnpCommand]\t CUpnpFilePipe::PushL" ); + + // Parameter check + if( aParam == KNullDesC ) + { + User::Leave( KErrArgument ); + } + + // If we are using a pipe with a limited size + if( iMaxSize > 0 ) + { + // If the pipe is already full (max size reached) remove the newest + // file from the pipe + if( iValues.Count() >= iMaxSize ) + { + RemoveNewestFileFromPipe(); + } + } + + // Create a new parameter value + HBufC* temp = aParam.AllocL(); + CleanupStack::PushL( temp ); + + // Append the new parameter value to the array + iValues.AppendL( temp ); + + // Just pop, ownership transfered to iValues array + CleanupStack::Pop( temp ); + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::FileAt +// -------------------------------------------------------------------------- +// +const TDesC& CUpnpFilePipe::FileAt( TInt aIndex ) + { + __ASSERTD( aIndex >= 0 && aIndex < iValues.Count(), + __FILE__, __LINE__ ); + TDesC* file = iValues[aIndex]; + return *file; + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::Reset +// Resets the pipe. +// -------------------------------------------------------------------------- +// +void CUpnpFilePipe::Reset() + { + __LOG( "[UpnpCommand]\t CUpnpFilePipe::Reset" ); + + // Simply reset the array + iValues.ResetAndDestroy(); + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::Count +// Returns the count of the items in the pipe. +// -------------------------------------------------------------------------- +// +TInt CUpnpFilePipe::Count() + { + __LOG( "[UpnpCommand]\t CUpnpFilePipe::Count" ); + + // Simply retun the array's item count + return iValues.Count(); + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::AsArray +// returns the entire pipe as an array +// -------------------------------------------------------------------------- +// +RPointerArray& CUpnpFilePipe::AsArray() + { + return iValues; + } + +// -------------------------------------------------------------------------- +// CUpnpFilePipe::RemoveNewestFileFromPipe +// Removes the newest file from the pipe. +// -------------------------------------------------------------------------- +// +void CUpnpFilePipe::RemoveNewestFileFromPipe() + { + __LOG( "[UpnpCommand]\t CUpnpFilePipe::RemoveNewestFileFromPipe" ); + + // Remove item only if there are items in the pipe + if( iValues.Count() > 0 ) + { + // Get the index of the newest item (last item in the array) + TInt newestIndex = iValues.Count() - 1; // indexing starts from 0 + + // Get the pointer to the data, and delete it + HBufC* temp = static_cast( iValues[newestIndex] ); + delete temp; + temp = NULL; + + // Remove the pointer from the array, this will also compress the + // array + iValues.Remove( newestIndex ); + } + } + +// End of file