Skip to content

Commit

Permalink
Merge pull request #3 from cherpake/master
Browse files Browse the repository at this point in the history
As we discussed
  • Loading branch information
ataranto committed Sep 20, 2011
2 parents dbe9d0f + ceb33c1 commit 1231458
Showing 1 changed file with 139 additions and 5 deletions.
144 changes: 139 additions & 5 deletions CefSharp/Utils.cpp
@@ -1,5 +1,8 @@
#include "stdafx.h"

using namespace System;
using namespace System::Collections::Generic;

namespace CefSharp
{
String^ toClr(const cef_string_t& cefStr)
Expand Down Expand Up @@ -100,17 +103,76 @@ namespace CefSharp
{
return CefV8Value::CreateInt( Convert::ToInt32(obj) );
}
if (type->IsArray)
{
CefRefPtr<CefV8Value> cefArray = CefV8Value::CreateArray();

System::Array^ managedArray = (System::Array^)obj;

for (int i = 0; i < managedArray->Length; i++)
{
System::Object^ arrObj;

arrObj = managedArray->GetValue(i);

if (arrObj != nullptr)
{
CefRefPtr<CefV8Value> cefObj = convertToCef(arrObj, arrObj->GetType());

cefArray->SetValue(i, cefObj);
}
else
{
cefArray->SetValue(i, CefV8Value::CreateNull());
}
}

return cefArray;
}
if (type->IsValueType && !type->IsPrimitive && !type->IsEnum)
{
CefRefPtr<CefV8Value> cefArray = CefV8Value::CreateArray();

cli::array<System::Reflection::FieldInfo^>^ fields = type->GetFields();

for (int i = 0; i < fields->Length; i++)
{
String^ fieldName = fields[i]->Name;

CefString strFieldName = toNative(safe_cast<String^>(fieldName));

Object^ fieldVal = fields[i]->GetValue(obj);

if (fieldVal != nullptr)
{
CefRefPtr<CefV8Value> cefVal = convertToCef(fieldVal, fieldVal->GetType());

cefArray->SetValue(strFieldName, cefVal);
}
else
{
cefArray->SetValue(strFieldName, CefV8Value::CreateNull());
}
}

return cefArray;
}
//TODO: What exception type?
throw gcnew Exception("Cannot convert object from CLR to Cef " + type->ToString() + ".");
}

System::String^ stdToString(const std::string& s)
{
return gcnew System::String(s.c_str());
}

Object^ convertFromCef(CefRefPtr<CefV8Value> obj)
{
if (obj->IsNull() || obj->IsUndefined() || obj->IsObject())
{
return nullptr;
}
if (obj->IsNull() || obj->IsUndefined())
{
return nullptr;
}

if (obj->IsBool())
return gcnew System::Boolean(obj->GetBoolValue());
if (obj->IsInt())
Expand All @@ -120,8 +182,80 @@ namespace CefSharp
if (obj->IsString())
return toClr(obj->GetStringValue());

if (obj->IsArray())
{
int arrLength = obj->GetArrayLength();

if (arrLength > 0)
{
std::vector<CefString> keys;
if (obj->GetKeys(keys))
{
Dictionary<String^, Object^>^ result = gcnew Dictionary<String^, Object^>();

for (int i = 0; i < arrLength; i++)
{
std::string p_key = keys[i].ToString();
String^ p_keyStr = stdToString(p_key);

if ((obj->HasValue(keys[i])) && (!p_keyStr->StartsWith("__")))
{
CefRefPtr<CefV8Value> data;

data = obj->GetValue(keys[i]);
if (data != nullptr)
{
Object^ p_data = convertFromCef(data);

result->Add(p_keyStr, p_data);
}
}
}

return result;
}
}

return nullptr;
}

if (obj->IsObject())
{
std::vector<CefString> keys;
if (obj->GetKeys(keys))
{
int objLength = keys.size();
if (objLength > 0)
{
Dictionary<String^, Object^>^ result = gcnew Dictionary<String^, Object^>();

for (int i = 0; i < objLength; i++)
{
std::string p_key = keys[i].ToString();
String^ p_keyStr = stdToString(p_key);

if ((obj->HasValue(keys[i])) && (!p_keyStr->StartsWith("__")))
{
CefRefPtr<CefV8Value> data;

data = obj->GetValue(keys[i]);
if (data != nullptr)
{
Object^ p_data = convertFromCef(data);

result->Add(p_keyStr, p_data);
}
}
}

return result;
}
}

return nullptr;
}

//TODO: What exception type?
throw gcnew Exception("Cannot convert object from Cef to CLR.");
}

}

0 comments on commit 1231458

Please sign in to comment.