shapelistmanager.cpp

来自「series60 应用程序开发的源代码 series60 应用程序开发的源代码」· C++ 代码 · 共 244 行

CPP
244
字号
/**
 * 
 * @brief Definition of CShapeListManager
 *
 * Copyright (c) EMCC Software Ltd 2003
 * @version 1.0
 */

// INCLUDE FILES

// Class Includes
#include    "ShapeListManager.h"

// User Includes
#include    "rectangle.h"
#include    "circle.h"

using namespace NShapes;


// ================= MEMBER FUNCTIONS =======================

/**
@function    NewLC
@abstract    Creates a new instance of the engine.
@result    Returns the engine
**/
EXPORT_C CShapeListManager* CShapeListManager::NewLC()
{
    CShapeListManager*    self = new (ELeave) CShapeListManager;
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
}

/**
@function    NewL
@abstract    Creates a new instance of the engine.
@result    Returns the engine
**/
EXPORT_C CShapeListManager* CShapeListManager::NewL()
{
    CShapeListManager*    self = CShapeListManager::NewLC();
    CleanupStack::Pop(self);
    return self;
}

/**
@function    CShapeListManager
@abstract    Performs any first stage construction
**/
EXPORT_C CShapeListManager::CShapeListManager()
{
    //    No implementation required
}

EXPORT_C CShapeListManager::~CShapeListManager()
{
    iShapeList.ResetAndDestroy();
}

/**
@function    ConstructL
@abstract    Performs any second stage construction
**/
EXPORT_C void CShapeListManager::ConstructL()
{
    //    No implementation required
}

/**
@function    Clear
@abstract    Clears the list of shapes. 
**/
EXPORT_C void CShapeListManager::Clear()
{
    iNextShapeIndex = 0;    //    The first shape in the list
    iShapeList.ResetAndDestroy();
}

/**
@function    AddShape
@abstract    Adds a shape to the list
@param aShape the object to add to the list. 
**/
EXPORT_C void CShapeListManager::AddShapeL(TShape* aShape)
{
    TInt error = iShapeList.Append(aShape);

    if (error != KErrNone)
    {
        delete aShape;
        User::Leave(error);
    }
}

/**
@function RemoveShape
@abstract Removes shape from the list
@param aShape the object to remove from the list
**/
EXPORT_C void CShapeListManager::RemoveShapeL(TShape* aShape)
{
    TInt itemIndex = iShapeList.Find(aShape);
    iShapeList.Remove(itemIndex);
    delete aShape;
}

/**
@function    GetNextShape
@abstract    Returns the next shape in the list and increments the next shape 
index. If there is no such shape, then it returns NULL, and resets the next shape index.
**/
EXPORT_C TShape* CShapeListManager::GetNextShape()
{
    if (iShapeList.Count() > 0) 
    {
        if (iNextShapeIndex < iShapeList.Count()) 
        {
            TShape* shape = iShapeList[iNextShapeIndex];
            ++iNextShapeIndex;
            return shape;
        }
        //    Gone past the end, so reset the index
        iNextShapeIndex = 0;
    }
    return NULL;
}

/**
@function    StoreL
@abstract    Stores the instance to the specified store
@param aStore the store to stream the object to
@result Returns the id of the store within the stream.
**/
EXPORT_C TStreamId CShapeListManager::StoreL(CStreamStore& aStore) const
{
    RStoreWriteStream stream;

    // Create a stream within the store
    TStreamId id = stream.CreateLC(aStore);

    // Write the data to the stream
    ExternalizeL(stream); 
    stream.CommitL();

    CleanupStack::PopAndDestroy(); // the stream

    return id; // return the stream ID          
}

/**
@function    ExternalizeL
@abstract    Stores the instance to the specified stream
@param aStream the stream to stream the object to
**/
EXPORT_C void CShapeListManager::ExternalizeL(RWriteStream& aStream) const
{
    TInt count = iShapeList.Count();

    aStream.WriteInt16L((TInt16)count);

    for (TInt index = 0; index < count; ++index)
    {
        const TShape* shape = iShapeList[index];
        shape->ExternalizeL(aStream);
    }
}


EXPORT_C TInt CShapeListManager::DataSize()
{
    TInt size = sizeof(TInt16);
    TInt count = iShapeList.Count();
    for(TInt index = 0; index < count; ++index)
    {    
        const TShape* shape = iShapeList[index];
        size += shape->StorageSize();
    
    }
    return size;
}

/**
@function    RestoreL
@abstract    Restores the instance from the specified stream within the specified 
store
@param aStore the store containing the data
@param aStreamId the id of the stream within the store
**/
EXPORT_C void CShapeListManager::RestoreL(const CStreamStore& aStore, const TStreamId& aStreamId)
{
    Clear();

    RStoreReadStream stream;
    // Open the stream
    stream.OpenLC(aStore, aStreamId);

    // Read the data from the stream
    InternalizeL(stream); 

    CleanupStack::PopAndDestroy(); // the stream
}

/**
@function    InternalizeL
@abstract    Restores the instance from the specified stream
@param aStream the stream to stream the object from
**/
EXPORT_C void CShapeListManager::InternalizeL(RReadStream& aStream)
{

    TInt count = aStream.ReadInt16L();
    for (TInt index = 0; index < count; ++index)
    {
        TShape* shape = NULL;
        switch (TShape::ReadShapeTypeL(aStream))
        {
            case KRectangle :
                shape = new (ELeave) TRectangle();
                break;
            case KCircle :
                shape = new (ELeave) TCircle();
                break;
            default :
                User::Leave(KErrCorrupt);
        }
        CleanupStack::PushL(shape);
        shape->InternalizeL(aStream);
        User::LeaveIfError(iShapeList.Append(shape));
        CleanupStack::Pop(shape);    //    Now owned by iShapeList
    }
}



// ================= OTHER EXPORTED FUNCTIONS ==============

// requirement for E32 DLLs
EXPORT_C TInt E32Dll(TDllReason)
{
    return KErrNone;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?