/*
 * Copyright (C) 2017 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#include <pal/spi/cg/CoreGraphicsSPI.h>

#if USE(APPLE_INTERNAL_SDK)

#include <ApplicationServices/ApplicationServicesPriv.h>

#else

typedef CF_ENUM(SInt32, CoreCursorType) {
    kCoreCursorFirstCursor = 0,
    kCoreCursorArrow = kCoreCursorFirstCursor,
    kCoreCursorIBeam,
    kCoreCursorMakeAlias,
    kCoreCursorNotAllowed,
    kCoreCursorBusyButClickable,
    kCoreCursorCopy,
    kCoreCursorScreenShotSelection = 7,
    kCoreCursorScreenShotSelectionToClip,
    kCoreCursorScreenShotWindow,
    kCoreCursorScreenShotWindowToClip,
    kCoreCursorClosedHand,
    kCoreCursorOpenHand,
    kCoreCursorPointingHand,
    kCoreCursorCountingUpHand,
    kCoreCursorCountingDownHand,
    kCoreCursorCountingUpAndDownHand,
    kCoreCursorResizeLeft,
    kCoreCursorResizeRight,
    kCoreCursorResizeLeftRight,
    kCoreCursorCross,
    kCoreCursorResizeUp,
    kCoreCursorResizeDown,
    kCoreCursorResizeUpDown,
    kCoreCursorContextualMenu,
    kCoreCursorPoof,
    kCoreCursorIBeamVertical,
    kCoreCursorWindowResizeEast,
    kCoreCursorWindowResizeEastWest,
    kCoreCursorWindowResizeNorthEast,
    kCoreCursorWindowResizeNorthEastSouthWest,
    kCoreCursorWindowResizeNorth,
    kCoreCursorWindowResizeNorthSouth,
    kCoreCursorWindowResizeNorthWest,
    kCoreCursorWindowResizeNorthWestSouthEast,
    kCoreCursorWindowResizeSouthEast,
    kCoreCursorWindowResizeSouth,
    kCoreCursorWindowResizeSouthWest,
    kCoreCursorWindowResizeWest,
    kCoreCursorWindowMove,
    kCoreCursorHelp,
    kCoreCursorCell,
    kCoreCursorZoomIn,
    kCoreCursorZoomOut,
    kCoreCursorLastCursor = kCoreCursorZoomOut
};

enum {
    kCoreDragImageSpecVersionOne = 1,
};

struct CoreDragImageSpec {
    UInt32 version;
    SInt32 pixelsWide;
    SInt32 pixelsHigh;
    SInt32 bitsPerSample;
    SInt32 samplesPerPixel;
    SInt32 bitsPerPixel;
    SInt32 bytesPerRow;
    Boolean isPlanar;
    Boolean hasAlpha;
    const UInt8* data[5];
};

enum {
    kMSHDoNotCreateSendRightOption = 0x4,
};

typedef UInt32 MSHCreateOptions;
typedef const struct __AXTextMarker* AXTextMarkerRef;
typedef const struct __AXTextMarkerRange* AXTextMarkerRangeRef;
typedef struct CoreDragImageSpec CoreDragImageSpec;
typedef struct OpaqueCoreDrag* CoreDragRef;

WTF_EXTERN_C_BEGIN

AXTextMarkerRangeRef AXTextMarkerRangeCreate(CFAllocatorRef, AXTextMarkerRef startMarker, AXTextMarkerRef endMarker);
AXTextMarkerRef AXTextMarkerCreate(CFAllocatorRef, const UInt8* bytes, CFIndex length);
AXTextMarkerRef AXTextMarkerRangeCopyStartMarker(AXTextMarkerRangeRef);
AXTextMarkerRef AXTextMarkerRangeCopyEndMarker(AXTextMarkerRangeRef);
CFIndex AXTextMarkerGetLength(AXTextMarkerRef);
CFRunLoopSourceRef MSHCreateMIGServerSource(CFAllocatorRef, CFIndex order, mig_subsystem_t sub_system, MSHCreateOptions, mach_port_t, void* user_data);
CFTypeID AXTextMarkerGetTypeID();
CFTypeID AXTextMarkerRangeGetTypeID();
CoreDragRef CoreDragGetCurrentDrag();
OSStatus CoreDragSetImage(CoreDragRef, CGPoint imageOffset, CoreDragImageSpec*, CGSRegionObj imageShape, float overallAlpha);
const UInt8* AXTextMarkerGetBytePtr(AXTextMarkerRef);
bool _AXUIElementRequestServicedBySecondaryAXThread(void);
OSStatus SetApplicationIsDaemon(Boolean);

#if ENABLE(ACCESSIBILITY_ISOLATED_TREE)
AXError _AXUIElementUseSecondaryAXThread(bool enabled);
#endif

#if HAVE(AX_CLIENT_TYPE)
typedef CF_ENUM(int32_t, AXClientType)
{
    kAXClientTypeNoActiveRequestFound  = 0,
    kAXClientTypeUnknown,
    kAXClientTypeRaft,
    kAXClientTypeXCUITest,
    kAXClientTypeXCTest,
    kAXClientTypeScripter2,
    kAXClientTypeSystemEvents,
    kAXClientTypeVoiceOver,
    kAXClientTypeAssistiveControl,
    kAXClientTypeFullKeyboardAccess,
    kAXClientTypeDictation,
};
AXClientType _AXGetClientForCurrentRequestUntrusted(void);
#endif // HAVE(AX_CLIENT_TYPE)

WTF_EXTERN_C_END

#endif // USE(APPLE_INTERNAL_SDK)
