JavaScriptCore:
[WebKit-https.git] / WebCore / platform / mac / SharedBufferMac.mm
1 /*
2  * Copyright (C) 2006 Apple Computer, 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 COMPUTER, 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 COMPUTER, 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 #include "config.h"
27 #include "FoundationExtras.h"
28 #include "SharedBuffer.h"
29 #include "WebCoreObjCExtras.h"
30 #include <string.h>
31 #include <wtf/PassRefPtr.h>
32
33 using namespace WebCore;
34
35 @interface SharedBufferData : NSData
36 {
37     SharedBuffer* sharedBuffer;
38 }
39
40 - (id)initWithSharedBuffer:(SharedBuffer*)buffer;
41 @end
42
43 @implementation SharedBufferData
44
45 #ifndef BUILDING_ON_TIGER
46 + (void)initialize
47 {
48     WebCoreObjCFinalizeOnMainThread(self);
49 }
50 #endif
51
52 - (void)dealloc
53 {
54     sharedBuffer->deref();
55     
56     [super dealloc];
57 }
58
59 - (void)finalize
60 {
61     sharedBuffer->deref();
62     
63     [super finalize];
64 }
65
66 - (id)initWithSharedBuffer:(SharedBuffer*)buffer
67 {
68     self = [super init];
69     
70     if (self) {
71         sharedBuffer = buffer;
72         sharedBuffer->ref();
73     }
74     
75     return self;
76 }
77
78 - (unsigned)length
79 {
80     return sharedBuffer->size();
81 }
82
83 - (const void *)bytes
84 {
85     return reinterpret_cast<const void*>(sharedBuffer->data());
86 }
87
88 @end
89
90 namespace WebCore {
91
92 PassRefPtr<SharedBuffer> SharedBuffer::wrapNSData(NSData *nsData)
93 {
94     return new SharedBuffer(nsData);
95 }
96
97 SharedBuffer::SharedBuffer(NSData *nsData)
98     : m_nsData(nsData)
99 {
100 }
101
102 NSData *SharedBuffer::createNSData()
103 {    
104     return [[SharedBufferData alloc] initWithSharedBuffer:this];
105 }
106
107 CFDataRef SharedBuffer::createCFData()
108 {    
109     return (CFDataRef)HardRetainWithNSRelease([[SharedBufferData alloc] initWithSharedBuffer:this]);
110 }
111
112 bool SharedBuffer::hasPlatformData() const
113 {
114     return m_nsData;
115 }
116
117 const char* SharedBuffer::platformData() const
118 {
119     return (const char*)[m_nsData.get() bytes];
120 }
121
122 unsigned SharedBuffer::platformDataSize() const
123 {
124     return [m_nsData.get() length];
125 }
126
127 void SharedBuffer::maybeTransferPlatformData()
128 {
129     if (!m_nsData)
130         return;
131     
132     ASSERT(m_buffer.size() == 0);
133         
134     m_buffer.append(reinterpret_cast<const char*>([m_nsData.get() bytes]), [m_nsData.get() length]);
135         
136     m_nsData = nil;
137 }
138
139 void SharedBuffer::clearPlatformData()
140 {
141     m_nsData = 0;
142 }
143
144 PassRefPtr<SharedBuffer> SharedBuffer::createWithContentsOfFile(const String& filePath)
145 {
146     NSData *resourceData = [NSData dataWithContentsOfFile:filePath];
147     if (resourceData) 
148         return SharedBuffer::wrapNSData(resourceData);
149     return 0;
150 }
151
152 }
153