/*
 * Copyright (C) 2016 The Android Open Source Project
 * Copyright (C) 2016 Mopria Alliance, Inc.
 * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
 *
 * Licensed 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.
 */
#ifndef __WPRINT_STATUS_TYPES_H__
#define __WPRINT_STATUS_TYPES_H__

#define LONG_ONE          ((unsigned long long) 1)

#define PRINTER_IDLE_BIT       (1 << 31)
#define PRINTER_IS_IDLE(X)     ((X) << PRINT_STATUS_MAX_STATE)
#define PRINTER_STATUS_MASK(X) ((X) & (PRINTER_IDLE_BIT - 1))

#define BLOCKED_REASON_UNABLE_TO_CONNECT (1 << PRINT_STATUS_UNABLE_TO_CONNECT)
#define BLOCKED_REASONS_PRINTER_BUSY     (1 << PRINT_STATUS_BUSY)
#define BLOCKED_REASONS_CANCELLED        (1 << PRINT_STATUS_CANCELLED)
#define BLOCKED_REASON_OUT_OF_PAPER      (1 << PRINT_STATUS_OUT_OF_PAPER)
#define BLOCKED_REASON_OUT_OF_INK        (1 << PRINT_STATUS_OUT_OF_INK)
#define BLOCKED_REASON_OUT_OF_TONER      (1 << PRINT_STATUS_OUT_OF_TONER)
#define BLOCKED_REASON_JAMMED            (1 << PRINT_STATUS_JAMMED)
#define BLOCKED_REASON_DOOR_OPEN         (1 << PRINT_STATUS_DOOR_OPEN)
#define BLOCKED_REASON_SVC_REQUEST       (1 << PRINT_STATUS_SVC_REQUEST)
#define BLOCKED_REASON_LOW_ON_INK        (1 << PRINT_STATUS_LOW_ON_INK)
#define BLOCKED_REASON_LOW_ON_TONER      (1 << PRINT_STATUS_LOW_ON_TONER)
#define BLOCKED_REASON_UNKNOWN           (1 << PRINT_STATUS_UNKNOWN)
#define BLOCKED_REASON_BUSY              (1 << PRINT_STATUS_PRINTING)
#define BLOCKED_REASON_IDLE              (1 << PRINT_STATUS_IDLE)
#define BLOCKED_REASON_CANCELLED         (1 << PRINT_STATUS_CANCELLED)
#define BLOCKED_REASON_PRINT_STATUS_VERY_LOW_ON_INK (1 << PRINT_STATUS_VERY_LOW_ON_INK)
#define BLOCKED_REASON_PARTIAL_CANCEL    (1 << PRINT_STATUS_PARTIAL_CANCEL)
#define BLOCKED_REASON_PAUSED            (LONG_ONE << PRINT_STATUS_PAUSED)
#define BLOCKED_REASON_STOPPED		     (LONG_ONE << PRINT_STATUS_STOPPED)
#define BLOCKED_REASON_INPUT_CANNOT_FEED_SIZE_SELECTED  \
    (LONG_ONE << PRINT_STATUS_INPUT_CANNOT_FEED_SIZE_SELECTED)
#define BLOCKED_REASON_INTERLOCK_ERROR   (LONG_ONE << PRINT_STATUS_INTERLOCK_ERROR)
#define BLOCKED_REASON_OUTPUT_MAILBOX_SELECT_FAILURE \
    (LONG_ONE << PRINT_STATUS_OUTPUT_MAILBOX_SELECT_FAILURE)
#define BLOCKED_REASON_OUTPUT_TRAY_MISSING (LONG_ONE << PRINT_STATUS_OUTPUT_TRAY_MISSING)
#define BLOCKED_REASON_BANDER_ERROR      (LONG_ONE << PRINT_STATUS_BANDER_ERROR)
#define BLOCKED_REASON_BINDER_ERROR      (LONG_ONE << PRINT_STATUS_BINDER_ERROR)
#define BLOCKED_REASON_POWER_ERROR       (LONG_ONE << PRINT_STATUS_POWER_ERROR)
#define BLOCKED_REASON_CLEANER_ERROR     (LONG_ONE << PRINT_STATUS_CLEANER_ERROR)
#define BLOCKED_REASON_DIE_CUTTER_ERROR  (LONG_ONE << PRINT_STATUS_DIE_CUTTER_ERROR)
#define BLOCKED_REASON_FOLDER_ERROR      (LONG_ONE << PRINT_STATUS_FOLDER_ERROR)
#define BLOCKED_REASON_IMPRINTER_ERROR   (LONG_ONE << PRINT_STATUS_IMPRINTER_ERROR)
#define BLOCKED_REASON_INPUT_TRAY_ERROR	 (LONG_ONE << PRINT_STATUS_INPUT_TRAY_ERROR)
#define BLOCKED_REASON_INSERTER_ERROR	 (LONG_ONE << PRINT_STATUS_INSERTER_ERROR)
#define BLOCKED_REASON_INTERPRETER_ERROR (LONG_ONE << PRINT_STATUS_INTERPRETER_ERROR)
#define BLOCKED_REASON_MAKE_ENVELOPE_ERROR (LONG_ONE << PRINT_STATUS_MAKE_ENVELOPE_ERROR)
#define BLOCKED_REASON_MARKER_ERROR      (LONG_ONE << PRINT_STATUS_MARKER_ERROR)
#define BLOCKED_REASON_MEDIA_ERROR		 (LONG_ONE << PRINT_STATUS_MEDIA_ERROR)
#define BLOCKED_REASON_PERFORATER_ERROR  (LONG_ONE << PRINT_STATUS_PERFORATER_ERROR)
#define BLOCKED_REASON_PUNCHER_ERROR     (LONG_ONE << PRINT_STATUS_PUNCHER_ERROR)
#define BLOCKED_REASON_SEPARATION_CUTTER_ERROR (LONG_ONE << PRINT_STATUS_SEPARATION_CUTTER_ERROR)
#define BLOCKED_REASON_SHEET_ROTATOR_ERROR (LONG_ONE << PRINT_STATUS_SHEET_ROTATOR_ERROR)
#define BLOCKED_REASON_SLITTER_ERROR     (LONG_ONE << PRINT_STATUS_SLITTER_ERROR)
#define BLOCKED_REASON_STACKER_ERROR     (LONG_ONE << PRINT_STATUS_STACKER_ERROR)
#define BLOCKED_REASON_STAPLER_ERROR     (LONG_ONE << PRINT_STATUS_STAPLER_ERROR)
#define BLOCKED_REASON_STITCHER_ERROR    (LONG_ONE << PRINT_STATUS_STITCHER_ERROR)
#define BLOCKED_REASON_SUBUNIT_ERROR     (LONG_ONE << PRINT_STATUS_SUBUNIT_ERROR)
#define BLOCKED_REASON_TRIMMER_ERROR     (LONG_ONE << PRINT_STATUS_TRIMMER_ERROR)
#define BLOCKED_REASON_WRAPPER_ERROR     (LONG_ONE << PRINT_STATUS_WRAPPER_ERROR)
#define BLOCKED_REASON_CLIENT_ERROR	     (LONG_ONE << PRINT_STATUS_CLIENT_ERROR)
#define BLOCKED_REASON_SERVER_ERROR	     (LONG_ONE << PRINT_STATUS_SERVER_ERROR)
#define BLOCKED_REASON_ALERT_REMOVAL_OF_BINARY_CHANGE_ENTRY \
    (LONG_ONE << PRINT_STATUS_ALERT_REMOVAL_OF_BINARY_CHANGE_ENTRY)
#define BLOCKED_REASON_CONFIGURATION_CHANGED (LONG_ONE << PRINT_STATUS_CONFIGURATION_CHANGED)
#define BLOCKED_REASON_CONNECTING_TO_DEVICE (LONG_ONE << PRINT_STATUS_CONNECTING_TO_DEVICE)
#define BLOCKED_REASON_STATE_DEACTIVATED (LONG_ONE << PRINT_STATUS_STATE_DEACTIVATED)
#define BLOCKED_REASON_DEVELOPER_ERROR   (LONG_ONE << PRINT_STATUS_DEVELOPER_ERROR)
#define BLOCKED_REASON_HOLD_NEW_JOBS     (LONG_ONE << PRINT_STATUS_HOLD_NEW_JOBS)
#define BLOCKED_REASON_OPC_LIFE_OVER     (LONG_ONE << PRINT_STATUS_OPC_LIFE_OVER)
#define BLOCKED_REASON_SPOOL_AREA_FULL   (LONG_ONE << PRINT_STATUS_SPOOL_AREA_FULL)
#define BLOCKED_REASON_TIMED_OUT         (LONG_ONE << PRINT_STATUS_TIMED_OUT)
#define BLOCKED_REASON_SHUTDOWN          (LONG_ONE << PRINT_STATUS_SHUTDOWN)
#define BLOCKED_REASON_PRINTER_MANUAL_RESET (LONG_ONE << PRINT_STATUS_PRINTER_MANUAL_RESET)
#define BLOCKED_REASON_PRINTER_NMS_RESET (LONG_ONE << PRINT_STATUS_PRINTER_NMS_RESET)

#define JOB_FAIL_REASON_UNABLE_TO_CONNECT (LONG_ONE << IPP_JOB_STATE_REASON_UNABLE_TO_CONNECT)
#define JOB_CANCEL_REASON_JOB_CANCELED_BY_USER \
    (LONG_ONE << IPP_JOB_STATE_REASON_JOB_CANCELED_BY_USER)
#define JOB_CANCEL_REASON_JOB_CANCELED_AT_DEVICE \
    (LONG_ONE << IPP_JOB_STATE_REASON_JOB_CANCELED_AT_DEVICE)
#define JOB_FAIL_REASON_ABORTED_BY_SYSTEM (LONG_ONE << IPP_JOB_STATE_REASON_ABORTED_BY_SYSTEM)
#define JOB_FAIL_REASON_UNSUPPORTED_COMPRESSION \
    (LONG_ONE << IPP_JOB_STATE_REASON_UNSUPPORTED_COMPRESSION)
#define JOB_FAIL_REASON_COMPRESSION_ERROR (LONG_ONE << IPP_JOB_STATE_REASON_COMPRESSION_ERROR)
#define JOB_FAIL_REASON_UNSUPPORTED_DOCUMENT_FORMAT \
    (LONG_ONE << IPP_JOB_STATE_REASON_UNSUPPORTED_DOCUMENT_FORMAT)
#define JOB_FAIL_REASON_DOCUMENT_FORMAT_ERROR \
    (LONG_ONE << IPP_JOB_STATE_REASON_DOCUMENT_FORMAT_ERROR)
#define JOB_FAIL_REASON_SERVICE_OFFLINE  (LONG_ONE << IPP_JOB_STATE_REASON_SERVICE_OFFLINE)
#define JOB_FAIL_REASON_DOCUMENT_PASSWORD_ERROR \
    (LONG_ONE << IPP_JOB_STATE_REASON_DOCUMENT_PASSWORD_ERROR)
#define JOB_FAIL_REASON_DOCUMENT_PERMISSION_ERROR \
    (LONG_ONE << IPP_JOB_STATE_REASON_DOCUMENT_PERMISSION_ERROR)
#define JOB_FAIL_REASON_DOCUMENT_SECURITY_ERROR \
    (LONG_ONE << IPP_JOB_STATE_REASON_DOCUMENT_SECURITY_ERROR)
#define JOB_FAIL_REASON_DOCUMENT_UNPRINTABLE_ERROR \
    (LONG_ONE << IPP_JOB_STATE_REASON_DOCUMENT_UNPRINTABLE_ERROR)
#define JOB_FAIL_REASON_DOCUMENT_ACCESS_ERROR \
    (LONG_ONE << IPP_JOB_STATE_REASON_DOCUMENT_ACCESS_ERROR)
#define JOB_FAIL_REASON_SUBMISSION_INTERRUPTED \
    (LONG_ONE << IPP_JOB_STATE_REASON_SUBMISSION_INTERRUPTED)
#define JOB_FAIL_REASON_AUTHORIZATION_FAILED \
    (LONG_ONE << IPP_JOB_STATE_REASON_AUTHORIZATION_FAILED)
#define JOB_FAIL_REASON_ACCOUNT_CLOSED   (LONG_ONE << IPP_JOB_STATE_REASON_ACCOUNT_CLOSED)
#define JOB_FAIL_REASON_ACCOUNT_INFO_NEEDED (LONG_ONE << IPP_JOB_STATE_REASON_ACCOUNT_INFO_NEEDED)
#define JOB_FAIL_REASON_ACCOUNT_LIMIT_REACHED \
    (LONG_ONE << IPP_JOB_STATE_REASON_ACCOUNT_LIMIT_REACHED)

/*
 * Enumeration for printer statuses
 */
typedef enum {
    PRINT_STATUS_INITIALIZING,
    PRINT_STATUS_SHUTTING_DOWN,
    PRINT_STATUS_UNABLE_TO_CONNECT,

    PRINT_STATUS_UNKNOWN,
    PRINT_STATUS_OFFLINE,

    PRINT_STATUS_BUSY,
    PRINT_STATUS_CANCELLED,

    PRINT_STATUS_IDLE,
    PRINT_STATUS_PRINTING,
    PRINT_STATUS_JAMMED,
    PRINT_STATUS_OUT_OF_PAPER,
    PRINT_STATUS_OUT_OF_INK,
    PRINT_STATUS_OUT_OF_TONER,
    PRINT_STATUS_DOOR_OPEN,
    PRINT_STATUS_SVC_REQUEST,
    PRINT_STATUS_PAUSED,
    PRINT_STATUS_STOPPED,

    PRINT_STATUS_LOW_ON_INK,
    PRINT_STATUS_LOW_ON_TONER,

    PRINT_STATUS_VERY_LOW_ON_INK,
    PRINT_STATUS_PARTIAL_CANCEL,

    PRINT_STATUS_INPUT_CANNOT_FEED_SIZE_SELECTED,
    PRINT_STATUS_INTERLOCK_ERROR,
    PRINT_STATUS_OUTPUT_MAILBOX_SELECT_FAILURE,
    PRINT_STATUS_OUTPUT_TRAY_MISSING,
    PRINT_STATUS_BANDER_ERROR,
    PRINT_STATUS_BINDER_ERROR,
    PRINT_STATUS_POWER_ERROR,
    PRINT_STATUS_CLEANER_ERROR,
    PRINT_STATUS_DIE_CUTTER_ERROR,
    PRINT_STATUS_FOLDER_ERROR,
    PRINT_STATUS_IMPRINTER_ERROR,
    PRINT_STATUS_INPUT_TRAY_ERROR,
    PRINT_STATUS_INSERTER_ERROR,
    PRINT_STATUS_INTERPRETER_ERROR,
    PRINT_STATUS_MAKE_ENVELOPE_ERROR,
    PRINT_STATUS_MARKER_ERROR,
    PRINT_STATUS_MEDIA_ERROR,
    PRINT_STATUS_PERFORATER_ERROR,
    PRINT_STATUS_PUNCHER_ERROR,
    PRINT_STATUS_SEPARATION_CUTTER_ERROR,
    PRINT_STATUS_SHEET_ROTATOR_ERROR,
    PRINT_STATUS_SLITTER_ERROR,
    PRINT_STATUS_STACKER_ERROR,
    PRINT_STATUS_STAPLER_ERROR,
    PRINT_STATUS_STITCHER_ERROR,
    PRINT_STATUS_SUBUNIT_ERROR,
    PRINT_STATUS_TRIMMER_ERROR,
    PRINT_STATUS_WRAPPER_ERROR,
    PRINT_STATUS_CLIENT_ERROR,
    PRINT_STATUS_SERVER_ERROR,

    PRINT_STATUS_ALERT_REMOVAL_OF_BINARY_CHANGE_ENTRY,
    PRINT_STATUS_CONFIGURATION_CHANGED,
    PRINT_STATUS_CONNECTING_TO_DEVICE,
    PRINT_STATUS_STATE_DEACTIVATED,
    PRINT_STATUS_DEVELOPER_ERROR,
    PRINT_STATUS_HOLD_NEW_JOBS,
    PRINT_STATUS_OPC_LIFE_OVER,
    PRINT_STATUS_SPOOL_AREA_FULL,
    PRINT_STATUS_TIMED_OUT,
    PRINT_STATUS_SHUTDOWN,
    PRINT_STATUS_PRINTER_MANUAL_RESET,
    PRINT_STATUS_PRINTER_NMS_RESET,

    PRINT_STATUS_MAX_STATE // Add new entries above this line.
} print_status_t;

/*
 * Structure for handling printer status
 */
typedef struct printer_state_dyn_s {
    // Printer state (idle, printing, service request, unknown)
    print_status_t printer_status;

    // all current print status events
    print_status_t printer_reasons[PRINT_STATUS_MAX_STATE + 1];

    int job_id;
} printer_state_dyn_t;

typedef enum {
    IPP_JOB_STATE_UNABLE_TO_CONNECT,
    IPP_JOB_STATE_UNKNOWN,
    IPP_JOB_STATE_PENDING,
    IPP_JOB_STATE_PENDING_HELD,
    IPP_JOB_STATE_PROCESSING,
    IPP_JOB_STATE_PROCESSING_STOPPED,
    IPP_JOB_STATE_CANCELED,
    IPP_JOB_STATE_ABORTED,
    IPP_JOB_STATE_COMPLETED,
    IPP_JOB_STATE_MAX_STATE,    // Add new entries above this line.
} job_state_t;

typedef enum {
    IPP_JOB_STATE_REASON_UNKNOWN,
    IPP_JOB_STATE_REASON_UNABLE_TO_CONNECT,
    IPP_JOB_STATE_REASON_JOB_CANCELED_BY_USER,
    IPP_JOB_STATE_REASON_JOB_CANCELED_AT_DEVICE,
    IPP_JOB_STATE_REASON_ABORTED_BY_SYSTEM,
    IPP_JOB_STATE_REASON_UNSUPPORTED_COMPRESSION,
    IPP_JOB_STATE_REASON_COMPRESSION_ERROR,
    IPP_JOB_STATE_REASON_UNSUPPORTED_DOCUMENT_FORMAT,
    IPP_JOB_STATE_REASON_DOCUMENT_FORMAT_ERROR,
    IPP_JOB_STATE_REASON_SERVICE_OFFLINE,
    IPP_JOB_STATE_REASON_DOCUMENT_PASSWORD_ERROR,
    IPP_JOB_STATE_REASON_DOCUMENT_PERMISSION_ERROR,
    IPP_JOB_STATE_REASON_DOCUMENT_SECURITY_ERROR,
    IPP_JOB_STATE_REASON_DOCUMENT_UNPRINTABLE_ERROR,
    IPP_JOB_STATE_REASON_DOCUMENT_ACCESS_ERROR,
    IPP_JOB_STATE_REASON_SUBMISSION_INTERRUPTED,
    IPP_JOB_STATE_REASON_AUTHORIZATION_FAILED,
    IPP_JOB_STATE_REASON_ACCOUNT_CLOSED,
    IPP_JOB_STATE_REASON_ACCOUNT_INFO_NEEDED,
    IPP_JOB_STATE_REASON_ACCOUNT_LIMIT_REACHED,
    IPP_JOB_STATE_REASON_MAX_VALUE,    // Add new entries above this line.
} job_state_reason_t;

typedef struct job_state_dyn_s
{
    job_state_t job_state;
    // all current job state reasons
    job_state_reason_t job_state_reasons[IPP_JOB_STATE_REASON_MAX_VALUE + 1];
} job_state_dyn_t;

#endif // __WPRINT_STATUS_TYPES_H__