ArgumentCodersCF.cpp revision 2fc2651226baac27029e38c9d6ef883fa32084db
165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentCodersCF.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentDecoder.h" 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentEncoder.h" 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "DataReference.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/Vector.h> 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace CoreIPC { 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochCFTypeRef tokenNullTypeRef() 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static CFStringRef tokenNullType = CFSTR("WKNull"); 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return tokenNullType; 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochenum CFType { 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFArray, 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFBoolean, 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFData, 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFDictionary, 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFNull, 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFNumber, 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFString, 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFURL, 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Null, 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Unknown, 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic CFType typeFromCFTypeRef(CFTypeRef type) 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(type); 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (type == tokenNullTypeRef()) 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return Null; 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFTypeID typeID = CFGetTypeID(type); 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFArrayGetTypeID()) 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFArray; 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFBooleanGetTypeID()) 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFBoolean; 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFDataGetTypeID()) 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFData; 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFDictionaryGetTypeID()) 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFDictionary; 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFNullGetTypeID()) 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFNull; 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFNumberGetTypeID()) 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFNumber; 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFStringGetTypeID()) 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFString; 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeID == CFURLGetTypeID()) 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return CFURL; 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT_NOT_REACHED(); 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return Unknown; 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void encode(ArgumentEncoder* encoder, CFTypeRef typeRef) 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFType type = typeFromCFTypeRef(typeRef); 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeEnum(type); 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (type) { 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFArray: 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFArrayRef>(typeRef)); 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFBoolean: 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFBooleanRef>(typeRef)); 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFData: 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFDataRef>(typeRef)); 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFDictionary: 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFDictionaryRef>(typeRef)); 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFNull: 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFNumber: 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFNumberRef>(typeRef)); 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFString: 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFStringRef>(typeRef)); 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFURL: 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFURLRef>(typeRef)); 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case Null: 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case Unknown: 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT_NOT_REACHED(); 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool decode(ArgumentDecoder* decoder, RetainPtr<CFTypeRef>& result) 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFType type; 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decodeEnum(type)) 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (type) { 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFArray: { 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFArrayRef> array; 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, array)) 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(array.leakRef()); 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFBoolean: { 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFBooleanRef> boolean; 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, boolean)) 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(boolean.leakRef()); 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFData: { 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFDataRef> data; 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, data)) 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(data.leakRef()); 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFDictionary: { 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFDictionaryRef> dictionary; 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, dictionary)) 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(dictionary.leakRef()); 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFNull: 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(kCFNull); 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFNumber: { 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFNumberRef> number; 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, number)) 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(number.leakRef()); 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFString: { 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFStringRef> string; 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, string)) 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(string.leakRef()); 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case CFURL: { 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFURLRef> url; 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, url)) 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(url.leakRef()); 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case Null: 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result = tokenNullTypeRef(); 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case Unknown: 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT_NOT_REACHED(); 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid encode(ArgumentEncoder* encoder, CFArrayRef array) 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFIndex size = CFArrayGetCount(array); 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<CFTypeRef, 32> values(size); 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFArrayGetValues(array, CFRangeMake(0, size), values.data()); 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeUInt64(size); 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (CFIndex i = 0; i < size; ++i) { 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(values[i]); 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, values[i]); 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool decode(ArgumentDecoder* decoder, RetainPtr<CFArrayRef>& result) 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t size; 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decodeUInt64(size)) 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFMutableArrayRef> array(AdoptCF, CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks)); 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < size; ++i) { 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFTypeRef> element; 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, element)) 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFArrayAppendValue(array.get(), element.get()); 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(array.leakRef()); 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid encode(ArgumentEncoder* encoder, CFBooleanRef boolean) 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeBool(CFBooleanGetValue(boolean)); 23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool decode(ArgumentDecoder* decoder, RetainPtr<CFBooleanRef>& result) 23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool boolean; 23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(boolean)) 23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(boolean ? kCFBooleanTrue : kCFBooleanFalse); 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid encode(ArgumentEncoder* encoder, CFDataRef data) 24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFIndex length = CFDataGetLength(data); 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const UInt8* bytePtr = CFDataGetBytePtr(data); 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeBytes(bytePtr, length); 24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool decode(ArgumentDecoder* decoder, RetainPtr<CFDataRef>& result) 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CoreIPC::DataReference dataReference; 25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(dataReference)) 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(CFDataCreate(0, dataReference.data(), dataReference.size())); 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid encode(ArgumentEncoder* encoder, CFDictionaryRef dictionary) 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFIndex size = CFDictionaryGetCount(dictionary); 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<CFTypeRef, 32> keys(size); 26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<CFTypeRef, 32> values(size); 26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFDictionaryGetKeysAndValues(dictionary, keys.data(), values.data()); 26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeUInt64(size); 26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (CFIndex i = 0; i < size; ++i) { 27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(keys[i]); 27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(CFGetTypeID(keys[i]) == CFStringGetTypeID()); 27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(values[i]); 27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Ignore values we don't recognize. 27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (typeFromCFTypeRef(values[i]) == Unknown) 27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch continue; 27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, static_cast<CFStringRef>(keys[i])); 28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, values[i]); 28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool decode(ArgumentDecoder* decoder, RetainPtr<CFDictionaryRef>& result) 28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t size; 28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decodeUInt64(size)) 28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFMutableDictionaryRef> dictionary(AdoptCF, CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); 29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (uint64_t i = 0; i < size; ++i) { 29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Try to decode the key name. 29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFStringRef> key; 29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, key)) 29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFTypeRef> value; 29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, value)) 29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFDictionarySetValue(dictionary.get(), key.get(), value.get()); 30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(dictionary.releaseRef()); 30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid encode(ArgumentEncoder* encoder, CFNumberRef number) 30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFNumberType numberType = CFNumberGetType(number); 31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<uint8_t> buffer(CFNumberGetByteSize(number)); 31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool result = CFNumberGetValue(number, numberType, buffer.data()); 31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT_UNUSED(result, result); 31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeEnum(numberType); 31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeBytes(buffer.data(), buffer.size()); 31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic size_t sizeForNumberType(CFNumberType numberType) 32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (numberType) { 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberSInt8Type: 32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(SInt8); 32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberSInt16Type: 32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(SInt16); 32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberSInt32Type: 32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(SInt32); 32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberSInt64Type: 33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(SInt64); 33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberFloat32Type: 33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(Float32); 33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberFloat64Type: 33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(Float64); 33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberCharType: 33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(char); 33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberShortType: 33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(short); 33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberIntType: 34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(int); 34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberLongType: 34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(long); 34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberLongLongType: 34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(long long); 34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberFloatType: 34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(float); 34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberDoubleType: 34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(double); 34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberCFIndexType: 35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(CFIndex); 35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberNSIntegerType: 35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifdef __LP64__ 35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(long); 35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else 35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(int); 35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case kCFNumberCGFloatType: 35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifdef __LP64__ 35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(double); 36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#else 36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return sizeof(float); 36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 0; 36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool decode(ArgumentDecoder* decoder, RetainPtr<CFNumberRef>& result) 36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFNumberType numberType; 37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decodeEnum(numberType)) 37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CoreIPC::DataReference dataReference; 37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(dataReference)) 37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t neededBufferSize = sizeForNumberType(numberType); 37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!neededBufferSize || dataReference.size() != neededBufferSize) 38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(dataReference.data()); 38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFNumberRef number = CFNumberCreate(0, numberType, dataReference.data()); 38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(number); 38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid encode(ArgumentEncoder* encoder, CFStringRef string) 39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFIndex length = CFStringGetLength(string); 39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFStringEncoding encoding = CFStringGetFastestEncoding(string); 39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFRange range = CFRangeMake(0, length); 39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFIndex bufferLength = 0; 39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFIndex numConvertedBytes = CFStringGetBytes(string, range, encoding, 0, false, 0, 0, &bufferLength); 39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(numConvertedBytes == length); 39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<UInt8, 128> buffer(bufferLength); 40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch numConvertedBytes = CFStringGetBytes(string, range, encoding, 0, false, buffer.data(), buffer.size(), &bufferLength); 40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(numConvertedBytes == length); 40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeEnum(encoding); 40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeBytes(buffer.data(), bufferLength); 40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool decode(ArgumentDecoder* decoder, RetainPtr<CFStringRef>& result) 40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 41065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFStringEncoding encoding; 41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decodeEnum(encoding)) 41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!CFStringIsEncodingAvailable(encoding)) 41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 41665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CoreIPC::DataReference dataReference; 41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(dataReference)) 41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFStringRef string = CFStringCreateWithBytes(0, dataReference.data(), dataReference.size(), encoding, false); 42265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!string) 42365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 42465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 42565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(string); 42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 42965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid encode(ArgumentEncoder* encoder, CFURLRef url) 43065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 43165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFURLRef baseURL = CFURLGetBaseURL(url); 43265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeBool(baseURL); 43365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (baseURL) 43465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, baseURL); 43565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 43665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encode(encoder, CFURLGetString(url)); 43765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 43865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 43965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool decode(ArgumentDecoder* decoder, RetainPtr<CFURLRef>& result) 44065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 44165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFURLRef> baseURL; 44265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool hasBaseURL; 44365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decodeBool(hasBaseURL)) 44465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 44565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (hasBaseURL) { 44665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, baseURL)) 44765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 44865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 44965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 45065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<CFStringRef> string; 45165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decode(decoder, string)) 45265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 45365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 45465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFURLRef url = CFURLCreateWithString(0, string.get(), baseURL.get()); 45565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!url) 45665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 45765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 45865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.adoptCF(url); 45965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 46065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 46165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 46265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace CoreIPC 46365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 464