1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "fpdfsdk/javascript/Annot.h"
8
9 #include "fpdfsdk/javascript/JS_Define.h"
10 #include "fpdfsdk/javascript/JS_Object.h"
11 #include "fpdfsdk/javascript/JS_Value.h"
12 #include "fpdfsdk/javascript/cjs_event_context.h"
13
14 namespace {
15
ToBAAnnot(CPDFSDK_Annot * annot)16 CPDFSDK_BAAnnot* ToBAAnnot(CPDFSDK_Annot* annot) {
17 return static_cast<CPDFSDK_BAAnnot*>(annot);
18 }
19
20 } // namespace
21
22 JSConstSpec CJS_Annot::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}};
23
24 JSPropertySpec CJS_Annot::PropertySpecs[] = {
25 {"hidden", get_hidden_static, set_hidden_static},
26 {"name", get_name_static, set_name_static},
27 {"type", get_type_static, set_type_static},
28 {0, 0, 0}};
29
30 JSMethodSpec CJS_Annot::MethodSpecs[] = {{0, 0}};
31
IMPLEMENT_JS_CLASS(CJS_Annot,Annot)32 IMPLEMENT_JS_CLASS(CJS_Annot, Annot)
33
34 Annot::Annot(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
35
~Annot()36 Annot::~Annot() {}
37
hidden(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)38 bool Annot::hidden(CJS_Runtime* pRuntime,
39 CJS_PropValue& vp,
40 CFX_WideString& sError) {
41 if (vp.IsGetting()) {
42 if (!m_pAnnot) {
43 sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
44 return false;
45 }
46 CPDF_Annot* pPDFAnnot = ToBAAnnot(m_pAnnot.Get())->GetPDFAnnot();
47 vp << CPDF_Annot::IsAnnotationHidden(pPDFAnnot->GetAnnotDict());
48 return true;
49 }
50
51 bool bHidden;
52 vp >> bHidden; // May invalidate m_pAnnot.
53 if (!m_pAnnot) {
54 sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
55 return false;
56 }
57
58 uint32_t flags = ToBAAnnot(m_pAnnot.Get())->GetFlags();
59 if (bHidden) {
60 flags |= ANNOTFLAG_HIDDEN;
61 flags |= ANNOTFLAG_INVISIBLE;
62 flags |= ANNOTFLAG_NOVIEW;
63 flags &= ~ANNOTFLAG_PRINT;
64 } else {
65 flags &= ~ANNOTFLAG_HIDDEN;
66 flags &= ~ANNOTFLAG_INVISIBLE;
67 flags &= ~ANNOTFLAG_NOVIEW;
68 flags |= ANNOTFLAG_PRINT;
69 }
70 ToBAAnnot(m_pAnnot.Get())->SetFlags(flags);
71 return true;
72 }
73
name(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)74 bool Annot::name(CJS_Runtime* pRuntime,
75 CJS_PropValue& vp,
76 CFX_WideString& sError) {
77 if (vp.IsGetting()) {
78 if (!m_pAnnot) {
79 sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
80 return false;
81 }
82 vp << ToBAAnnot(m_pAnnot.Get())->GetAnnotName();
83 return true;
84 }
85
86 CFX_WideString annotName;
87 vp >> annotName; // May invalidate m_pAnnot.
88 if (!m_pAnnot) {
89 sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
90 return false;
91 }
92
93 ToBAAnnot(m_pAnnot.Get())->SetAnnotName(annotName);
94 return true;
95 }
96
type(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)97 bool Annot::type(CJS_Runtime* pRuntime,
98 CJS_PropValue& vp,
99 CFX_WideString& sError) {
100 if (vp.IsSetting()) {
101 sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
102 return false;
103 }
104 if (!m_pAnnot) {
105 sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
106 return false;
107 }
108 vp << CPDF_Annot::AnnotSubtypeToString(
109 ToBAAnnot(m_pAnnot.Get())->GetAnnotSubtype());
110 return true;
111 }
112
SetSDKAnnot(CPDFSDK_BAAnnot * annot)113 void Annot::SetSDKAnnot(CPDFSDK_BAAnnot* annot) {
114 m_pAnnot.Reset(annot);
115 }
116