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