SquirrelJME/SquirrelJME

View on GitHub
emulators/springcoat-vm/src/main/java/cc/squirreljme/vm/springcoat/MLENativeArchive.java

Summary

Maintainability
A
0 mins
Test Coverage
// -*- Mode: Java; indent-tabs-mode: t; tab-width: 4 -*-
// ---------------------------------------------------------------------------
// Multi-Phasic Applications: SquirrelJME
//     Copyright (C) Stephanie Gawroriski <xer@multiphasicapps.net>
// ---------------------------------------------------------------------------
// SquirrelJME is under the Mozilla Public License Version 2.0.
// See license.mkd for licensing and copyright information.
// ---------------------------------------------------------------------------

package cc.squirreljme.vm.springcoat;

import cc.squirreljme.jvm.mle.NativeArchiveShelf;
import cc.squirreljme.jvm.mle.brackets.NativeArchiveBracket;
import cc.squirreljme.jvm.mle.brackets.NativeArchiveEntryBracket;
import cc.squirreljme.jvm.mle.exceptions.MLECallError;
import cc.squirreljme.vm.springcoat.brackets.NativeArchiveEntryObject;
import cc.squirreljme.vm.springcoat.brackets.NativeArchiveObject;
import cc.squirreljme.vm.springcoat.exceptions.SpringMLECallError;
import java.io.IOException;

/**
 * SpringCoat layer for {@link NativeArchiveShelf}.
 *
 * @since 2024/03/05
 */
public enum MLENativeArchive
    implements MLEFunction
{
    /** {@link NativeArchiveShelf#archiveClose(NativeArchiveBracket)}. */
    ARCHIVE_CLOSE("archiveClose:" +
        "(Lcc/squirreljme/jvm/mle/brackets/NativeArchiveBracket;)V")
    {
        /**
         * {@inheritDoc}
         * @since 2024/03/05
         */
        @Override
        public Object handle(SpringThreadWorker __thread, Object... __args)
        {
            Object archive = __args[0];
            
            try
            {
                NativeArchiveShelf.archiveClose(
                    MLEObjects.archive(archive).wrapped);
            }
            catch (MLECallError __e)
            {
                throw new SpringMLECallError(__e);
            }
            
            return null;
        }
    },
    
    /**
     * {@link NativeArchiveShelf#archiveEntry(NativeArchiveBracket,
     * String)}.
     */
    ARCHIVE_ENTRY("archiveEntry:" +
        "(Lcc/squirreljme/jvm/mle/brackets/NativeArchiveBracket;" +
        "Ljava/lang/String;)" +
        "Lcc/squirreljme/jvm/mle/brackets/NativeArchiveEntryBracket;")
    {
        /**
         * {@inheritDoc}
         * @since 2024/03/05
         */
        @Override
        public Object handle(SpringThreadWorker __thread, Object... __args)
        {
            Object archive = __args[0];
            String name = __thread.asNativeObject(String.class, __args[1]);
            
            try
            {
                NativeArchiveEntryBracket entry =
                    NativeArchiveShelf.archiveEntry(
                        MLEObjects.archive(archive).wrapped,
                        name);
                if (entry == null)
                    return SpringNullObject.NULL;
                
                return new NativeArchiveEntryObject(__thread.machine,
                    entry);
            }
            catch (MLECallError __e)
            {
                throw new SpringMLECallError(__e);
            }
        }
    },
    
    /** {@link NativeArchiveShelf#archiveOpenZip(byte[], int, int)}. */
    ARCHIVE_OPEN_ZIP("archiveOpenZip:" +
        "([BII)Lcc/squirreljme/jvm/mle/brackets/NativeArchiveBracket;")
    {
        /**
         * {@inheritDoc}
         * @since 2024/03/05
         */
        @Override
        public Object handle(SpringThreadWorker __thread, Object... __args)
        {
            SpringArrayObjectByte buf = (SpringArrayObjectByte)__args[0];
            int off = (Integer)__args[1];
            int len = (Integer)__args[2];
            
            try
            {
                return new NativeArchiveObject(__thread.machine,
                    NativeArchiveShelf.archiveOpenZip(buf.array(),
                        off, len));
            }
            catch (MLECallError __e)
            {
                throw new SpringMLECallError(__e);
            }
        }
    },
    
    /**
     * {@link NativeArchiveShelf#entryIsDirectory(NativeArchiveEntryBracket)}.
     */
    ENTRY_IS_DIRECTORY("entryIsDirectory:" +
        "(Lcc/squirreljme/jvm/mle/brackets/NativeArchiveEntryBracket;)Z")
    {
        /**
         * {@inheritDoc}
         * @since 2024/03/05
         */
        @Override
        public Object handle(SpringThreadWorker __thread, Object... __args)
        {
            NativeArchiveEntryObject entry =
                MLEObjects.archiveEntry(__args[0]);
            
            try
            {
                return NativeArchiveShelf.entryIsDirectory(entry.wrapped);
            }
            catch (MLECallError __e)
            {
                throw new SpringMLECallError(__e);
            }
        }
    },
    
    /** {@link NativeArchiveShelf#entryOpen(NativeArchiveEntryBracket)}. */
    ENTRY_OPEN("entryOpen:" +
        "(Lcc/squirreljme/jvm/mle/brackets/NativeArchiveEntryBracket;)" +
        "Ljava/io/InputStream;")
    {
        /**
         * {@inheritDoc}
         * @since 2024/03/05
         */
        @Override
        public Object handle(SpringThreadWorker __thread, Object... __args)
        {
            NativeArchiveEntryObject entry =
                MLEObjects.archiveEntry(__args[0]);
            
            try
            {
                return __thread.proxyInputStream(
                    NativeArchiveShelf.entryOpen(entry.wrapped));
            }
            catch (MLECallError|IOException __e)
            {
                throw new SpringMLECallError(__e);
            }
        }
    },
    
    /**
     * {@link NativeArchiveShelf#entryUncompressedSize(
     * NativeArchiveEntryBracket)}.
     */
    ENTRY_UNCOMPRESSED_SIZE("entryUncompressedSize:" +
        "(Lcc/squirreljme/jvm/mle/brackets/NativeArchiveEntryBracket;)J")
    {
        /**
         * {@inheritDoc}
         * @since 2024/03/05
         */
        @Override
        public Object handle(SpringThreadWorker __thread, Object... __args)
        {
            NativeArchiveEntryObject entry =
                MLEObjects.archiveEntry(__args[0]);
            
            try
            {
                return NativeArchiveShelf.entryUncompressedSize(entry.wrapped);
            }
            catch (MLECallError __e)
            {
                throw new SpringMLECallError(__e);
            }
        }
    },
    
    /** End. */
    ;
    
    /** The dispatch key. */
    protected final String key;
    
    /**
     * Initializes the dispatcher info.
     *
     * @param __key The key.
     * @throws NullPointerException On null arguments.
     * @since 2024/03/05
     */
    MLENativeArchive(String __key)
        throws NullPointerException
    {
        if (__key == null)
            throw new NullPointerException("NARG");
        
        this.key = __key;
    }
    
    /**
     * {@inheritDoc}
     * @since 2024/03/05
     */
    @Override
    public String key()
    {
        return this.key;
    }
    
}