예제 #1
0
RefPtr<SharedBuffer> serializeIDBKeyData(const IDBKeyData& key)
{
#if USE(CF)
    Vector<char> data;
    data.append(SIDBKeyVersion);

    encodeKey(data, key);
    return SharedBuffer::adoptVector(data);
#else
    auto encoder = KeyedEncoder::encoder();
    key.encode(*encoder);
    return encoder->finishEncoding();
#endif

}
예제 #2
0
static void encodeKey(Vector<char>& data, const IDBKeyData& key)
{
    SIDBKeyType type = serializedTypeForKeyType(key.type());
    data.append(static_cast<char>(type));

    switch (type) {
    case SIDBKeyType::Number:
        writeDouble(data, key.number());
        break;
    case SIDBKeyType::Date:
        writeDouble(data, key.date());
        break;
    case SIDBKeyType::String: {
        auto string = key.string();
        uint32_t length = string.length();
        writeLittleEndian(data, length);

        for (size_t i = 0; i < length; ++i)
            writeLittleEndian(data, string[i]);

        break;
    }
    case SIDBKeyType::Binary: {
        auto& buffer = key.binary();
        uint64_t size = buffer.size();
        writeLittleEndian(data, size);

        auto* bufferData = buffer.data();
        ASSERT(bufferData || !size);
        if (bufferData)
            data.append(bufferData->data(), bufferData->size());

        break;
    }
    case SIDBKeyType::Array: {
        auto& array = key.array();
        uint64_t size = array.size();
        writeLittleEndian(data, size);
        for (auto& key : array)
            encodeKey(data, key);

        break;
    }
    case SIDBKeyType::Min:
    case SIDBKeyType::Max:
        break;
    }
}
예제 #3
0
	void KeyBuilder::createKey( char cp[sizeKey] ) {
		GUID guid;
		(void)::CoCreateGuid( &guid );
		encodeKey( (uint8_t*)&guid, cp );
	}
예제 #4
0
	KeyBuilder::KeyBuilder( const uint8_t key[sizeGuid] ) {
		encodeKey( (const uint8_t*)key, buf );
	}
예제 #5
0
static void writeEntries(FILE *pStream, const KEntryMap &entryMap, bool defaultGroup, bool &firstEntry, const QCString &localeString)
{
    // now write out all other groups.
    QCString currentGroup;
    for(KEntryMapConstIterator aIt = entryMap.begin(); aIt != entryMap.end(); ++aIt)
    {
        const KEntryKey &key = aIt.key();

        // Either proces the default group or all others
        if((key.mGroup != "<default>") == defaultGroup)
            continue; // Skip

        // Skip default values and group headers.
        if((key.bDefault) || key.mKey.isEmpty())
            continue; // Skip

        const KEntry &currentEntry = *aIt;

        KEntryMapConstIterator aTestIt = aIt;
        ++aTestIt;
        bool hasDefault = (aTestIt != entryMap.end());
        if(hasDefault)
        {
            const KEntryKey &defaultKey = aTestIt.key();
            if((!defaultKey.bDefault) || (defaultKey.mKey != key.mKey) || (defaultKey.mGroup != key.mGroup) || (defaultKey.bLocal != key.bLocal))
                hasDefault = false;
        }


        if(hasDefault)
        {
            // Entry had a default value
            if((currentEntry.mValue == (*aTestIt).mValue) && (currentEntry.bDeleted == (*aTestIt).bDeleted))
                continue; // Same as default, don't write.
        }
        else
        {
            // Entry had no default value.
            if(currentEntry.bDeleted)
                continue; // Don't write deleted entries if there is no default.
        }

        if(!defaultGroup && (currentGroup != key.mGroup))
        {
            if(!firstEntry)
                fprintf(pStream, "\n");
            currentGroup = key.mGroup;
            fprintf(pStream, "[%s]\n", encodeGroup(currentGroup).data());
        }

        firstEntry = false;
        // it is data for a group
        fputs(encodeKey(key.mKey.data()), pStream); // Key

        if(currentEntry.bNLS)
        {
            fputc('[', pStream);
            fputs(localeString.data(), pStream);
            fputc(']', pStream);
        }

        if(currentEntry.bDeleted)
        {
            fputs("[$d]\n", pStream); // Deleted
        }
        else
        {
            if(currentEntry.bImmutable || currentEntry.bExpand)
            {
                fputc('[', pStream);
                fputc('$', pStream);
                if(currentEntry.bImmutable)
                    fputc('i', pStream);
                if(currentEntry.bExpand)
                    fputc('e', pStream);

                fputc(']', pStream);
            }
            fputc('=', pStream);
            fputs(stringToPrintable(currentEntry.mValue).data(), pStream);
            fputc('\n', pStream);
        }
    } // for loop
}