// Copyright © 2015 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. #include "Stdafx.h" #include "ObjectsSerialization.h" #include "Primitives.h" using namespace System::Collections::Generic; using namespace System::Dynamic; namespace CefSharp { namespace Internals { namespace Serialization { template Object^ DeserializeObject(const CefRefPtr& list, TIndex index, IJavascriptCallbackFactory^ javascriptCallbackFactory) { Object^ result = nullptr; auto type = list->GetType(index); if (type == VTYPE_BOOL) { result = list->GetBool(index); } else if (type == VTYPE_INT) { result = list->GetInt(index); } else if (IsInt64(list, index)) { result = GetInt64(list, index); } else if (IsCefTime(list, index)) { auto cefTime = GetCefTime(list, index); result = ConvertCefTimeToDateTime(cefTime); } else if (IsJsCallback(list, index) && javascriptCallbackFactory != nullptr) { auto jsCallbackDto = GetJsCallback(list, index); result = javascriptCallbackFactory->Create(jsCallbackDto); } else if (type == VTYPE_DOUBLE) { result = list->GetDouble(index); } else if (type == VTYPE_STRING) { result = StringUtils::ToClr(list->GetString(index)); } else if (type == VTYPE_LIST) { auto subList = list->GetList(index); auto array = gcnew List(subList->GetSize()); for (auto i = 0; i < subList->GetSize(); i++) { array->Add(DeserializeObject(subList, i, javascriptCallbackFactory)); } result = array; } else if (type == VTYPE_DICTIONARY) { IDictionary^ expandoObj = gcnew ExpandoObject(); auto subDict = list->GetDictionary(index); std::vector keys; subDict->GetKeys(keys); for (auto i = 0; i < keys.size(); i++) { auto key = StringUtils::ToClr(keys[i]); auto value = DeserializeObject(subDict, keys[i], javascriptCallbackFactory); expandoObj->Add(key, value); } result = expandoObj; } return result; } DateTime ConvertCefTimeToDateTime(CefTime time) { auto epoch = time.GetDoubleT(); if (epoch == 0) { return DateTime::MinValue; } return DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(epoch).ToLocalTime(); } } } }