javatools/javaapppreconverter/src.s60/midletlist.cpp
changeset 21 2a9601315dfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javaapppreconverter/src.s60/midletlist.cpp	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,513 @@
+/*
+* Copyright (c) 2008 - 2009 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: Java platform 2.0 javaapppreconverter process
+*
+*/
+
+#include "midletlist.h"
+
+
+
+CMidletInfo::CMidletInfo() :
+        iMidletUid(TUid::Null()), iMidletId(KMaxTUint32), iSuiteId(KMaxTUint32),
+        iMidletName(NULL), iGroupName(NULL), iDrive(EDriveE)
+{
+}
+
+CMidletInfo::CMidletInfo(CMidletInfo* aMidletInfo)
+{
+    iMidletUid = aMidletInfo->GetMidletUid();
+    iMidletId = aMidletInfo->GetMidletId();
+    iSuiteId = aMidletInfo->GetSuiteId();
+    iMidletName = aMidletInfo->GetMidletName().Alloc();
+    iGroupName = aMidletInfo->GetGroupName().Alloc();
+    iDrive = aMidletInfo->GetDrive();
+    iIconFileName = aMidletInfo->GetIconFileName();
+}
+
+
+CMidletInfo::~CMidletInfo()
+{
+    delete iMidletName;
+    delete iGroupName;
+}
+
+
+TUid CMidletInfo::GetMidletUid() const
+{
+    return iMidletUid;
+}
+
+TUint32 CMidletInfo::GetMidletId() const
+{
+    return iMidletId;
+}
+
+TUint32 CMidletInfo::GetSuiteId() const
+{
+    return iSuiteId;
+}
+
+const TDesC& CMidletInfo::GetMidletName()
+{
+    if (NULL == iMidletName)
+    {
+        return KNullDesC;
+    }
+    else
+    {
+        return *iMidletName;
+    }
+}
+
+const TDesC& CMidletInfo::GetGroupName()
+{
+    if (NULL == iGroupName)
+    {
+        return KNullDesC;
+    }
+    else
+    {
+        return *iGroupName;
+    }
+}
+
+TDriveNumber CMidletInfo::GetDrive()
+{
+    return iDrive;
+}
+
+const TFileName& CMidletInfo::GetIconFileName()
+{
+    return iIconFileName;
+}
+
+
+
+
+void CMidletInfo::SetMidletUid(const TUid aUid)
+{
+    iMidletUid = aUid;
+}
+
+void CMidletInfo::SetMidletId(const TUint32 aId)
+{
+    iMidletId = aId;
+}
+
+void CMidletInfo::SetSuiteId(const TUint32 aId)
+{
+    iSuiteId = aId;
+}
+
+void CMidletInfo::SetMidletName(const TDesC& aName)
+{
+    iMidletName = aName.Alloc();
+}
+
+void CMidletInfo::SetGroupName(const TDesC& aName)
+{
+    iGroupName = aName.Alloc();
+}
+
+void CMidletInfo::SetDrive(const TDriveNumber aDrive)
+{
+    iDrive = aDrive;
+}
+
+void CMidletInfo::SetIconFileName(HBufC16 *aIconFileName)
+{
+    iIconFileName = *aIconFileName;
+}
+
+void CMidletInfo::SetIconFileName(const TFileName &aIconFileName)
+{
+    iIconFileName = aIconFileName;
+}
+
+void CMidletInfo::ExternalizeL(RWriteStream& aStream) const
+{
+    aStream.WriteUint32L(iMidletUid.iUid);
+    aStream.WriteUint32L(iMidletId);
+    aStream.WriteUint32L(iSuiteId);
+
+    TInt32 nLen = 0;
+    if (iMidletName)
+    {
+        nLen = iMidletName->Length();
+    }
+    aStream.WriteInt32L(nLen);
+    if (nLen > 0)
+    {
+        aStream.WriteL(*iMidletName);
+    }
+
+    nLen = 0;
+    if (iGroupName)
+    {
+        nLen = iGroupName->Length();
+    }
+    aStream.WriteInt32L(nLen);
+    if (nLen > 0)
+    {
+        aStream.WriteL(*iGroupName);
+    }
+
+    aStream.WriteUint32L(iDrive);
+
+    nLen = iIconFileName.Length();
+    aStream.WriteInt32L(nLen);
+    if (nLen > 0)
+    {
+        aStream.WriteL(iIconFileName);
+    }
+
+}
+
+void CMidletInfo::InternalizeL(RReadStream& aStream)
+{
+    iMidletUid.iUid = aStream.ReadUint32L();
+    iMidletId = aStream.ReadUint32L();
+    iSuiteId = aStream.ReadUint32L();
+
+    TInt32 nLen = 0;
+    nLen = aStream.ReadInt32L();
+    if (nLen > 0)
+    {
+        if (!iMidletName)
+        {
+            iMidletName = HBufC16::NewL(nLen + 8);
+        }
+
+        TPtr16 tmpDes = iMidletName->Des();
+        aStream.ReadL(tmpDes, nLen);
+    }
+    else
+    {
+        if (!iMidletName)
+        {
+            // empty midlet name
+            iMidletName = HBufC16::NewL(8);
+        }
+    }
+
+    nLen = aStream.ReadInt32L();
+    if (nLen > 0)
+    {
+        if (!iGroupName)
+        {
+            iGroupName = HBufC16::NewL(nLen + 8);
+        }
+        TPtr16 tmpDes = iGroupName->Des();
+        aStream.ReadL(tmpDes, nLen);
+    }
+    else
+    {
+        if (!iGroupName)
+        {
+            // empty group name
+            iGroupName = HBufC16::NewL(8);
+        }
+    }
+
+    iDrive = (TDriveNumber)aStream.ReadUint32L();
+
+    nLen = aStream.ReadInt32L();
+    if (nLen > 0)
+    {
+        aStream.ReadL(iIconFileName, nLen);
+    }
+}
+
+void CMidletInfo::ToString8(TDes8& aDescription)
+{
+    aDescription.Append(_L8("Uid: "));
+    aDescription.AppendNumFixedWidth(iMidletUid.iUid, EHex, 8);
+    aDescription.Append(_L8("\nMidlet id: "));
+    aDescription.AppendNumFixedWidth(iMidletId, EDecimal, 8);
+    aDescription.Append(_L8("\nSuite id: "));
+    aDescription.AppendNumFixedWidth(iSuiteId, EDecimal, 8);
+    aDescription.Append(_L8("\nName: "));
+    // Midlet name len is not limited. Make sure that buffer does not overflow.
+    aDescription.Append((*iMidletName).Left(256));
+    aDescription.Append(_L8("\nGroup: "));
+    // Group name is max 32 characters
+    aDescription.Append(*iGroupName);
+    aDescription.Append(_L8("\nDrive: "));
+    aDescription.AppendNumFixedWidth(iDrive, EDecimal, 2);
+}
+
+/* ---------------------------------------------------------------------------- */
+
+
+
+
+CMidletList::CMidletList() :
+        iMidletArray(RPointerArray<CMidletInfo>()), iGetNextIndex(0),
+        iMidletArrayDestroyed(EFalse)
+{
+
+}
+
+CMidletList::~CMidletList()
+{
+    // Free the memory used by the RPointerArray.
+    // Do not destroy objects itself.
+    if (!iMidletArrayDestroyed)
+    {
+        iMidletArray.Close();
+    }
+}
+
+void CMidletList::ResetAndDestroy()
+{
+    iMidletArray.ResetAndDestroy();
+    iMidletArrayDestroyed = ETrue;
+}
+
+TInt CMidletList::Append(const CMidletInfo* aMidletInfo)
+{
+    if (NULL != Find(aMidletInfo->GetMidletUid()))
+    {
+        // midlet is already in list, do nothing
+        return KErrNone;
+    }
+
+    return iMidletArray.Append(aMidletInfo);
+}
+
+void CMidletList::Remove(const CMidletInfo* aMidletInfo)
+{
+    TInt nInd = iMidletArray.Find(aMidletInfo);
+    if (nInd < 0)
+    {
+        // The object is not in list, do nothing
+        return;
+    }
+    else if (nInd < iGetNextIndex)
+    {
+        // Removing one of the objects already returned by
+        // getNext(), the indexes of the objects not yet returned by
+        // getNext() are decreased by one. Must decrease iGetNextIndex too.
+        iGetNextIndex--;
+    }
+
+    iMidletArray.Remove(nInd);
+}
+
+TInt CMidletList::Count() const
+{
+    return iMidletArray.Count();
+}
+
+CMidletInfo* CMidletList::GetFirst()
+{
+    iGetNextIndex = 1;
+
+    if (iMidletArray.Count() > 0)
+    {
+        return iMidletArray[0];
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+CMidletInfo* CMidletList::GetNext()
+{
+    if (iMidletArray.Count() > iGetNextIndex)
+    {
+        iGetNextIndex++;
+        return iMidletArray[iGetNextIndex-1];
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+CMidletInfo *CMidletList::Find(const TUid aMidletUid)
+{
+    TInt nCount = iMidletArray.Count();
+
+    for (TInt nInd = 0; nInd < nCount; nInd++)
+    {
+        if (iMidletArray[nInd]->GetMidletUid() == aMidletUid)
+        {
+            return iMidletArray[nInd];
+        }
+    }
+
+    return NULL;
+}
+
+/**
+ * Return the first midlet that has name specified by aName and
+ * for which the midlet id and suite id have not yet been set.
+ * If midlet id and suite id have been set for all midlets with
+ * name specified by aName, returns the first midlet with name
+ * specified by aName
+ */
+CMidletInfo *CMidletList::Find(const TPtrC &aName)
+{
+    CMidletInfo *firstFound = NULL;
+    TInt nCount = iMidletArray.Count();
+
+    for (TInt nInd = 0; nInd < nCount; nInd++)
+    {
+        if (iMidletArray[nInd]->GetMidletName() == aName)
+        {
+            // If midlet id and suite id have already been set,
+            // find next midlet with the same name if any.
+            // If no such midlet, return this one.
+            if (NULL == firstFound)
+            {
+                firstFound = iMidletArray[nInd];
+            }
+            if ((iMidletArray[nInd]->GetSuiteId() == KMaxTUint32) &&
+                    (iMidletArray[nInd]->GetMidletId() == KMaxTUint32))
+            {
+                return iMidletArray[nInd];
+            }
+        }
+    }
+
+    return firstFound;
+}
+
+void CMidletList::SetIds(
+    const TUint32 aUid,
+    const TUint32 aMidletSuiteId,
+    const TUint32 aMidletId)
+{
+    TUid uid;
+    uid.iUid = aUid;
+    CMidletInfo *midlet = Find(uid);
+
+    if (NULL != midlet)
+    {
+        midlet->SetSuiteId(aMidletSuiteId);
+        midlet->SetMidletId(aMidletId);
+    }
+}
+
+void CMidletList::SetIds(
+    const TPtrC &aName,
+    const TUint32 aMidletSuiteId,
+    const TUint32 aMidletId)
+{
+    CMidletInfo *midlet = Find(aName);
+
+    if (NULL != midlet)
+    {
+        midlet->SetSuiteId(aMidletSuiteId);
+        midlet->SetMidletId(aMidletId);
+    }
+}
+
+void CMidletList::ExportListL(RFs& aFs, const TFileName &aDirectory)
+{
+    if (iMidletArrayDestroyed || (iMidletArray.Count() == 0))
+    {
+        // Trying to export empty list is an error
+        User::Leave(KErrArgument);
+    }
+
+    // Create directory if it does not exist
+    TInt err= aFs.MkDirAll(aDirectory);
+    if ((KErrNone != err) && (KErrAlreadyExists != err))
+    {
+        User::Leave(err);
+    }
+
+    // Copy all icon files to directory
+    CFileMan    *fm = CFileMan::NewL(aFs);
+    CleanupStack::PushL(fm);
+    CMidletInfo *midlet = GetFirst();
+    TFileName    newIconFileName;
+    TParse       nameParser;
+    TUint32      nMidlets = 0;
+
+    while (NULL != midlet)
+    {
+        User::LeaveIfError(fm->Copy(midlet->GetIconFileName(), aDirectory));
+
+        // set new icon file name
+        newIconFileName = aDirectory;
+        User::LeaveIfError(nameParser.Set(midlet->GetIconFileName(), NULL, NULL));
+        newIconFileName.Append(nameParser.NameAndExt());
+        midlet->SetIconFileName(newIconFileName);
+
+        nMidlets++;
+        midlet = GetNext();
+    }
+
+    // Store all midlet info to a file in the directory
+    TFileName dataFilename = aDirectory;
+    dataFilename.Append(KMidletExportDataFileName);
+
+    // Construct write stream so that new data file is created.
+    // If the file already exists, leave
+    RFileWriteStream writeStream;
+    User::LeaveIfError(writeStream.Create(aFs, dataFilename, EFileWrite));
+    CleanupClosePushL(writeStream);
+
+    // Write the number of midlets
+    writeStream.WriteUint32L(nMidlets);
+
+    // write the midlet info one by one
+    midlet = GetFirst();
+    while (NULL != midlet)
+    {
+        midlet->ExternalizeL(writeStream);
+        midlet = GetNext();
+    }
+
+    CleanupStack::PopAndDestroy();  // writeStream
+    CleanupStack::PopAndDestroy(fm);
+}
+
+void CMidletList::ImportListL(RFs& aFs, const TFileName &aDirectory)
+{
+    CMidletInfo *midlet = NULL;
+
+    // Form the data file name
+    TFileName dataFilename = aDirectory;
+    dataFilename.Append(KMidletExportDataFileName);
+
+    // Open existing data file. If the file does not exist, leave
+    RFileReadStream readStream;
+    User::LeaveIfError(readStream.Open(aFs, dataFilename, EFileRead));
+    CleanupClosePushL(readStream);
+
+    // Read the number of midlets
+    TUint32 nMidlets = readStream.ReadUint32L();
+
+    for (TInt nInd = 0; nInd < nMidlets; nInd++)
+    {
+        // Read info of one midlet
+        midlet = new(ELeave) CMidletInfo;
+        CleanupStack::PushL(midlet);
+        midlet->InternalizeL(readStream);
+
+        // Add it to list
+        Append(midlet);
+        CleanupStack::Pop(midlet);
+    }
+
+    // close readStream
+    CleanupStack::PopAndDestroy();
+}
+