run-webkit-tests: Handle case where device socket make handle invalid
[WebKit-https.git] / Source / WebCore / platform / cocoa / SharedBufferCocoa.mm
1 /*
2  * Copyright (C) 2006-2019 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "config.h"
27 #import "SharedBuffer.h"
28
29 #import "WebCoreObjCExtras.h"
30 #import <JavaScriptCore/InitializeThreading.h>
31 #import <string.h>
32 #import <wtf/MainThread.h>
33
34 @interface WebCoreSharedBufferData : NSData
35 - (instancetype)initWithDataSegment:(const WebCore::SharedBuffer::DataSegment&)dataSegment position:(NSUInteger)position;
36 @end
37
38 @implementation WebCoreSharedBufferData {
39     RefPtr<const WebCore::SharedBuffer::DataSegment> _dataSegment;
40     NSUInteger _position;
41 }
42
43 + (void)initialize
44 {
45 #if !USE(WEB_THREAD)
46     JSC::initializeThreading();
47     WTF::initializeMainThread();
48 #endif // !USE(WEB_THREAD)
49 }
50
51 - (void)dealloc
52 {
53     if (WebCoreObjCScheduleDeallocateOnMainThread([WebCoreSharedBufferData class], self))
54         return;
55
56     [super dealloc];
57 }
58
59 - (instancetype)initWithDataSegment:(const WebCore::SharedBuffer::DataSegment&)dataSegment position:(NSUInteger)position
60 {
61     if (!(self = [super init]))
62         return nil;
63
64     RELEASE_ASSERT(!position || position < dataSegment.size());
65     _dataSegment = &dataSegment;
66     _position = position;
67     return self;
68 }
69
70 - (NSUInteger)length
71 {
72     return _dataSegment->size() - _position;
73 }
74
75 - (const void *)bytes
76 {
77     return _dataSegment->data() + _position;
78 }
79
80 @end
81
82 namespace WebCore {
83
84 Ref<SharedBuffer> SharedBuffer::create(NSData *nsData)
85 {
86     return adoptRef(*new SharedBuffer((__bridge CFDataRef)nsData));
87 }
88
89 void SharedBuffer::append(NSData *nsData)
90 {
91     return append((__bridge CFDataRef)nsData);
92 }
93
94 RetainPtr<NSData> SharedBuffer::createNSData() const
95 {
96     return adoptNS((NSData *)createCFData().leakRef());
97 }
98
99 RetainPtr<CFDataRef> SharedBuffer::createCFData() const
100 {
101     combineIntoOneSegment();
102     if (!m_segments.size())
103         return adoptCF(CFDataCreate(nullptr, nullptr, 0));
104     ASSERT(m_segments.size() == 1);
105     return adoptCF((__bridge CFDataRef)m_segments[0].segment->createNSData().leakRef());
106 }
107
108 RefPtr<SharedBuffer> SharedBuffer::createFromReadingFile(const String& filePath)
109 {
110     NSData *resourceData = [NSData dataWithContentsOfFile:filePath];
111     if (resourceData) 
112         return SharedBuffer::create(resourceData);
113     return nullptr;
114 }
115
116 RetainPtr<NSArray> SharedBuffer::createNSDataArray() const
117 {
118     auto dataArray = adoptNS([[NSMutableArray alloc] initWithCapacity:m_segments.size()]);
119     for (const auto& segment : m_segments)
120         [dataArray addObject:segment.segment->createNSData().get()];
121     return WTFMove(dataArray);
122 }
123
124 RetainPtr<NSData> SharedBuffer::DataSegment::createNSData() const
125 {
126     return adoptNS([[WebCoreSharedBufferData alloc] initWithDataSegment:*this position:0]);
127 }
128
129 RetainPtr<NSData> SharedBufferDataView::createNSData() const
130 {
131     return adoptNS([[WebCoreSharedBufferData alloc] initWithDataSegment:m_segment.get() position:m_positionWithinSegment]);
132 }
133
134 } // namespace WebCore