Unreviewed, fix iOS build with recent SDKs.
[WebKit-https.git] / Source / WebKit / UIProcess / API / Cocoa / _WKAttachment.mm
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "_WKAttachment.h"
28
29 #import "APIAttachment.h"
30 #import "WKErrorPrivate.h"
31 #import "_WKAttachmentInternal.h"
32 #import <WebCore/MIMETypeRegistry.h>
33 #import <WebCore/SharedBuffer.h>
34 #import <wtf/BlockPtr.h>
35
36 #if PLATFORM(IOS_FAMILY)
37 #import <MobileCoreServices/MobileCoreServices.h>
38 #endif
39
40 static const NSInteger UnspecifiedAttachmentErrorCode = 1;
41 static const NSInteger InvalidAttachmentErrorCode = 2;
42
43 @implementation _WKAttachmentDisplayOptions : NSObject
44 @end
45
46 @implementation _WKAttachmentInfo {
47     RetainPtr<NSFileWrapper> _fileWrapper;
48     RetainPtr<NSString> _mimeType;
49     RetainPtr<NSString> _utiType;
50     RetainPtr<NSString> _filePath;
51 }
52
53 - (instancetype)initWithFileWrapper:(NSFileWrapper *)fileWrapper filePath:(NSString *)filePath mimeType:(NSString *)mimeType utiType:(NSString *)utiType
54 {
55     if (!(self = [super init]))
56         return nil;
57
58     _fileWrapper = fileWrapper;
59     _filePath = filePath;
60     _mimeType = mimeType;
61     _utiType = utiType;
62     return self;
63 }
64
65 - (NSData *)data
66 {
67     if (![_fileWrapper isRegularFile]) {
68         // FIXME: Handle attachments backed by NSFileWrappers that represent directories.
69         return nil;
70     }
71
72     return [_fileWrapper regularFileContents];
73 }
74
75 - (NSString *)name
76 {
77     if ([_fileWrapper filename].length)
78         return [_fileWrapper filename];
79
80     return [_fileWrapper preferredFilename];
81 }
82
83 - (NSString *)filePath
84 {
85     return _filePath.get();
86 }
87
88 - (NSFileWrapper *)fileWrapper
89 {
90     return _fileWrapper.get();
91 }
92
93 - (NSString *)contentType
94 {
95     if ([_mimeType length])
96         return _mimeType.get();
97
98     return _utiType.get();
99 }
100
101 @end
102
103 @implementation _WKAttachment
104
105 - (API::Object&)_apiObject
106 {
107     return *_attachment;
108 }
109
110 - (_WKAttachmentInfo *)info
111 {
112     if (!_attachment->isValid())
113         return nil;
114
115     return [[[_WKAttachmentInfo alloc] initWithFileWrapper:_attachment->fileWrapper() filePath:_attachment->filePath() mimeType:_attachment->mimeType() utiType:_attachment->utiType()] autorelease];
116 }
117
118 - (void)requestInfo:(void(^)(_WKAttachmentInfo *, NSError *))completionHandler
119 {
120     completionHandler(self.info, nil);
121 }
122
123 - (void)setFileWrapper:(NSFileWrapper *)fileWrapper contentType:(NSString *)contentType completion:(void (^)(NSError *))completionHandler
124 {
125     if (!_attachment->isValid()) {
126         if (completionHandler)
127             completionHandler([NSError errorWithDomain:WKErrorDomain code:InvalidAttachmentErrorCode userInfo:nil]);
128         return;
129     }
130
131     // This file path member is only populated when the attachment is generated upon dropping files. When data is specified via NSFileWrapper
132     // from the SPI client, the corresponding file path of the data is unknown, if it even exists at all.
133     _attachment->setFilePath({ });
134     _attachment->setFileWrapperAndUpdateContentType(fileWrapper, contentType);
135     _attachment->updateAttributes([capturedBlock = makeBlockPtr(completionHandler)] (auto error) {
136         if (!capturedBlock)
137             return;
138
139         if (error == WebKit::CallbackBase::Error::None)
140             capturedBlock(nil);
141         else
142             capturedBlock([NSError errorWithDomain:WKErrorDomain code:UnspecifiedAttachmentErrorCode userInfo:nil]);
143     });
144 }
145
146 - (void)setData:(NSData *)data newContentType:(NSString *)newContentType newFilename:(NSString *)newFilename completion:(void(^)(NSError *))completionHandler
147 {
148     auto fileWrapper = adoptNS([[NSFileWrapper alloc] initRegularFileWithContents:data]);
149     if (newFilename)
150         [fileWrapper setPreferredFilename:newFilename];
151     [self setFileWrapper:fileWrapper.get() contentType:newContentType completion:completionHandler];
152 }
153
154 - (NSString *)uniqueIdentifier
155 {
156     return _attachment->identifier();
157 }
158
159 - (NSString *)description
160 {
161     return [NSString stringWithFormat:@"<%@ %p id='%@'>", [self class], self, self.uniqueIdentifier];
162 }
163
164 - (BOOL)isConnected
165 {
166     return _attachment->insertionState() == API::Attachment::InsertionState::Inserted;
167 }
168
169 @end