/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.hwmf.record;

import java.io.IOException;

import org.apache.poi.hwmf.draw.HwmfGraphics;
import org.apache.poi.util.HexDump;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.LittleEndianConsts;
import org.apache.poi.util.LittleEndianInputStream;

/**
 * The MetafileEscapes specifies printer driver functionality that
 * might not be directly accessible through WMF records
 */
public class HwmfEscape implements HwmfRecord {
    
    public enum EscapeFunction {
        /** Notifies the printer driver that the application has finished writing to a page. */
        NEWFRAME(0x0001),
        /** Stops processing the current document. */
        ABORTDOC(0x0002),
        /** Notifies the printer driver that the application has finished writing to a band. */
        NEXTBAND(0x0003),
        /** Sets color table values. */
        SETCOLORTABLE(0x0004),
        /** Gets color table values. */
        GETCOLORTABLE(0x0005),
        /** Causes all pending output to be flushed to the output device. */
        FLUSHOUT(0x0006),
        /** Indicates that the printer driver SHOULD print text only, and no graphics. */
        DRAFTMODE(0x0007),
        /** Queries a printer driver to determine whether a specific escape function is supported on the output device it drives. */
        QUERYESCSUPPORT(0x0008),
        /** Sets the application-defined function that allows a print job to be canceled during printing. */
        SETABORTPROC(0x0009),
        /** Notifies the printer driver that a new print job is starting. */
        STARTDOC(0x000A),
        /** Notifies the printer driver that the current print job is ending. */
        ENDDOC(0x000B),
        /** Retrieves the physical page size currently selected on an output device. */
        GETPHYSPAGESIZE(0x000C),
        /** Retrieves the offset from the upper-left corner of the physical page where the actual printing or drawing begins. */
        GETPRINTINGOFFSET(0x000D),
        /** Retrieves the scaling factors for the x-axis and the y-axis of a printer. */
        GETSCALINGFACTOR(0x000E),
        /** Used to embed an enhanced metafile format (EMF) metafile within a WMF metafile. */
        META_ESCAPE_ENHANCED_METAFILE(0x000F),
        /** Sets the width of a pen in pixels. */
        SETPENWIDTH(0x0010),
        /** Sets the number of copies. */
        SETCOPYCOUNT(0x0011),
        /** Sets the source, such as a particular paper tray or bin on a printer, for output forms. */
        SETPAPERSOURCE(0x0012),
        /** This record passes through arbitrary data. */
        PASSTHROUGH(0x0013),
        /** Gets information concerning graphics technology that is supported on a device. */
        GETTECHNOLOGY(0x0014),
        /** Specifies the line-drawing mode to use in output to a device. */
        SETLINECAP(0x0015),
        /** Specifies the line-joining mode to use in output to a device. */
        SETLINEJOIN(0x0016),
        /** Sets the limit for the length of miter joins to use in output to a device. */
        SETMITERLIMIT(0x0017),
        /** Retrieves or specifies settings concerning banding on a device, such as the number of bands. */
        BANDINFO(0x0018),
        /** Draws a rectangle with a defined pattern. */
        DRAWPATTERNRECT(0x0019),
        /** Retrieves the physical pen size currently defined on a device. */
        GETVECTORPENSIZE(0x001A),
        /** Retrieves the physical brush size currently defined on a device. */
        GETVECTORBRUSHSIZE(0x001B),
        /** Enables or disables double-sided (duplex) printing on a device. */
        ENABLEDUPLEX(0x001C),
        /** Retrieves or specifies the source of output forms on a device. */
        GETSETPAPERBINS(0x001D),
        /** Retrieves or specifies the paper orientation on a device. */
        GETSETPRINTORIENT(0x001E),
        /** Retrieves information concerning the sources of different forms on an output device. */
        ENUMPAPERBINS(0x001F),
        /** Specifies the scaling of device-independent bitmaps (DIBs). */
        SETDIBSCALING(0x0020),
        /** Indicates the start and end of an encapsulated PostScript (EPS) section. */
        EPSPRINTING(0x0021),
        /** Queries a printer driver for paper dimensions and other forms data. */
        ENUMPAPERMETRICS(0x0022),
        /** Retrieves or specifies paper dimensions and other forms data on an output device. */
        GETSETPAPERMETRICS(0x0023),
        /** Sends arbitrary PostScript data to an output device. */
        POSTSCRIPT_DATA(0x0025),
        /** Notifies an output device to ignore PostScript data. */
        POSTSCRIPT_IGNORE(0x0026),
        /** Gets the device units currently configured on an output device. */
        GETDEVICEUNITS(0x002A),
        /** Gets extended text metrics currently configured on an output device. */
        GETEXTENDEDTEXTMETRICS(0x0100),
        /** Gets the font kern table currently defined on an output device. */
        GETPAIRKERNTABLE(0x0102),
        /** Draws text using the currently selected font, background color, and text color. */
        EXTTEXTOUT(0x0200),
        /** Gets the font face name currently configured on a device. */
        GETFACENAME(0x0201),
        /** Sets the font face name on a device. */
        DOWNLOADFACE(0x0202),
        /** Queries a printer driver about the support for metafiles on an output device. */
        METAFILE_DRIVER(0x0801),
        /** Queries the printer driver about its support for DIBs on an output device. */
        QUERYDIBSUPPORT(0x0C01),
        /** Opens a path. */
        BEGIN_PATH(0x1000),
        /** Defines a clip region that is bounded by a path. The input MUST be a 16-bit quantity that defines the action to take. */
        CLIP_TO_PATH(0x1001),
        /** Ends a path. */
        END_PATH(0x1002),
        /** The same as STARTDOC specified with a NULL document and output filename, data in raw mode, and a type of zero. */
        OPEN_CHANNEL(0x100E),
        /** Instructs the printer driver to download sets of PostScript procedures. */
        DOWNLOADHEADER(0x100F),
        /** The same as ENDDOC. See OPEN_CHANNEL. */
        CLOSE_CHANNEL(0x1010),
        /** Sends arbitrary data directly to a printer driver, which is expected to process this data only when in PostScript mode. */
        POSTSCRIPT_PASSTHROUGH(0x1013),
        /** Sends arbitrary data directly to the printer driver. */
        ENCAPSULATED_POSTSCRIPT(0x1014),
        /** Sets the printer driver to either PostScript or GDI mode. */
        POSTSCRIPT_IDENTIFY(0x1015),
        /** Inserts a block of raw data into a PostScript stream. The input MUST be
        a 32-bit quantity specifying the number of bytes to inject, a 16-bit quantity specifying the
        injection point, and a 16-bit quantity specifying the page number, followed by the bytes to
        inject. */
        POSTSCRIPT_INJECTION(0x1016),
        /** Checks whether the printer supports a JPEG image. */
        CHECKJPEGFORMAT(0x1017),
        /** Checks whether the printer supports a PNG image */
        CHECKPNGFORMAT(0x1018),
        /** Gets information on a specified feature setting for a PostScript printer driver. */
        GET_PS_FEATURESETTING(0x1019),
        /** Enables applications to write documents to a file or to a printer in XML Paper Specification (XPS) format. */
        MXDC_ESCAPE(0x101A),
        /** Enables applications to include private procedures and other arbitrary data in documents. */
        SPCLPASSTHROUGH2(0x11D8);
        
        int flag;
        EscapeFunction(int flag) {
            this.flag = flag;
        }

        static EscapeFunction valueOf(int flag) {
            for (EscapeFunction hs : values()) {
                if (hs.flag == flag) return hs;
            }
            return null;
        }
    }
    
    /**
     * A 16-bit unsigned integer that defines the escape function. The 
     * value MUST be from the MetafileEscapes enumeration.
     */
    private EscapeFunction escapeFunction;
    /**
     * A 16-bit unsigned integer that specifies the size, in bytes, of the 
     * EscapeData field.
     */
    private int byteCount;
    /**
     * An array of bytes of size ByteCount.
     */
    private byte escapeData[];
    
    @Override
    public HwmfRecordType getRecordType() {
        return HwmfRecordType.escape;
    }
    
    @Override
    public int init(LittleEndianInputStream leis, long recordSize, int recordFunction) throws IOException {
        escapeFunction = EscapeFunction.valueOf(leis.readUShort());
        byteCount = leis.readUShort();
        escapeData = IOUtils.toByteArray(leis,byteCount);

        return 2*LittleEndianConsts.SHORT_SIZE+byteCount;
    }

    @Override
    public void draw(HwmfGraphics ctx) {
        
    }
    
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("escape - function: "+escapeFunction+"\n");
        sb.append(HexDump.dump(escapeData, 0, 0));
        return sb.toString();
    }
}
