static COMPtr<IPropertyBag> createUserInfoFromArray(BSTR notificationStr, IWebHistoryItem** data, size_t size) { #if USE(CF) RetainPtr<CFArrayRef> arrayItem = adoptCF(CFArrayCreate(kCFAllocatorDefault, (const void**)data, size, &MarshallingHelpers::kIUnknownArrayCallBacks)); RetainPtr<CFMutableDictionaryRef> dictionary = adoptCF( CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); RetainPtr<CFStringRef> key = adoptCF(MarshallingHelpers::BSTRToCFStringRef(notificationStr)); CFDictionaryAddValue(dictionary.get(), key.get(), arrayItem.get()); COMPtr<CFDictionaryPropertyBag> result = CFDictionaryPropertyBag::createInstance(); result->setDictionary(dictionary.get()); return COMPtr<IPropertyBag>(AdoptCOM, result.leakRef()); #else Vector<COMPtr<IWebHistoryItem>, 1> arrayItem; arrayItem.reserveInitialCapacity(size); for (size_t i = 0; i < size; ++i) arrayItem[i] = data[i]; HashMap<String, Vector<COMPtr<IWebHistoryItem>>> dictionary; String key(notificationStr, ::SysStringLen(notificationStr)); dictionary.set(key, std::move(arrayItem)); return COMPtr<IPropertyBag>(AdoptCOM, COMPropertyBag<Vector<COMPtr<IWebHistoryItem>>>::adopt(dictionary)); #endif }