// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../include/javascript/JavaScript.h"
#include "../../include/javascript/IJavaScript.h"
#include "../../include/javascript/JS_Define.h"
#include "../../include/javascript/JS_Object.h"
#include "../../include/javascript/JS_Value.h"
#include "../../include/javascript/Icon.h"

/* ---------------------- Icon ---------------------- */

BEGIN_JS_STATIC_CONST(CJS_Icon)
END_JS_STATIC_CONST()

BEGIN_JS_STATIC_PROP(CJS_Icon)
	JS_STATIC_PROP_ENTRY(name)
END_JS_STATIC_PROP()

BEGIN_JS_STATIC_METHOD(CJS_Icon) 
END_JS_STATIC_METHOD()

IMPLEMENT_JS_CLASS(CJS_Icon,Icon)

Icon::Icon(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),
	m_pIconStream(NULL),
	m_swIconName(L"")
{
}

Icon::~Icon()
{

}

void Icon::SetStream(CPDF_Stream* pIconStream)
{
	if(pIconStream)
		m_pIconStream = pIconStream;
}

CPDF_Stream* Icon::GetStream()
{
	return m_pIconStream;
}

void Icon::SetIconName(CFX_WideString name)
{
	m_swIconName = name;
}

CFX_WideString Icon::GetIconName()
{
	return m_swIconName;
}

FX_BOOL Icon::name(OBJ_PROP_PARAMS)
{
	if(!vp.IsGetting())return FALSE;

	vp << m_swIconName;
	return TRUE;
}

