1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/foxitlib.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_utils.h"
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_object.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_document.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_parser.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_script.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_docdata.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_doclayout.h"
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_localemgr.h"
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa_basic_imp.h"
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_PACKETINFO g_XFAPacketData[];
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int32_t g_iXFAPacketCount;
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_ATTRIBUTEENUMINFO g_XFAEnumData[];
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int32_t g_iXFAEnumCount;
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_ATTRIBUTEINFO g_XFAAttributeData[];
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int32_t g_iXFAAttributeCount;
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_ELEMENTINFO g_XFAElementData[];
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int32_t g_iXFAElementCount;
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_ELEMENTHIERARCHY g_XFAElementChildrenIndex[];
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const FX_WORD g_XFAElementChildrenData[];
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_ELEMENTHIERARCHY g_XFAElementAttributeIndex[];
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const uint8_t g_XFAElementAttributeData[];
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_NOTSUREATTRIBUTE g_XFANotsureAttributes[];
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int32_t g_iXFANotsureCount;
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_ELEMENTHIERARCHY g_XFAElementPropertyIndex[];
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_PROPERTY g_XFAElementPropertyData[];
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[];
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_METHODINFO g_SomMethodData[];
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int32_t g_iSomMethodCount;
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const XFA_SCRIPTATTRIBUTEINFO g_SomAttributeData[];
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannextern const int32_t g_iSomAttributeCount;
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCPACKETINFO XFA_GetPacketByName(const CFX_WideStringC& wsName) {
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = wsName.GetLength();
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLength == 0) {
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = 0, iEnd = g_iXFAPacketCount - 1;
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iMid = (iStart + iEnd) / 2;
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCPACKETINFO pInfo = g_XFAPacketData + iMid;
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (uHash == pInfo->uHash) {
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pInfo;
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (uHash < pInfo->uHash) {
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iEnd = iMid - 1;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart = iMid + 1;
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (iStart <= iEnd);
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCPACKETINFO XFA_GetPacketByID(FX_DWORD dwPacket) {
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = 0, iEnd = g_iXFAPacketCount - 1;
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iMid = (iStart + iEnd) / 2;
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD dwFind = (g_XFAPacketData + iMid)->eName;
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwPacket == dwFind) {
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return g_XFAPacketData + iMid;
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (dwPacket < dwFind) {
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iEnd = iMid - 1;
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart = iMid + 1;
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (iStart <= iEnd);
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCATTRIBUTEENUMINFO XFA_GetAttributeEnumByName(
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_WideStringC& wsName) {
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = wsName.GetLength();
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLength == 0) {
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = 0, iEnd = g_iXFAEnumCount - 1;
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iMid = (iStart + iEnd) / 2;
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCATTRIBUTEENUMINFO pInfo = g_XFAEnumData + iMid;
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (uHash == pInfo->uHash) {
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pInfo;
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (uHash < pInfo->uHash) {
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iEnd = iMid - 1;
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart = iMid + 1;
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (iStart <= iEnd);
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCATTRIBUTEENUMINFO XFA_GetAttributeEnumByID(XFA_ATTRIBUTEENUM eName) {
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return g_XFAEnumData + eName;
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t XFA_GetAttributeCount() {
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return g_iXFAAttributeCount;
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCATTRIBUTEINFO XFA_GetAttributeByName(const CFX_WideStringC& wsName) {
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = wsName.GetLength();
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLength == 0) {
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = 0, iEnd = g_iXFAAttributeCount - 1;
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iMid = (iStart + iEnd) / 2;
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCATTRIBUTEINFO pInfo = g_XFAAttributeData + iMid;
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (uHash == pInfo->uHash) {
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pInfo;
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (uHash < pInfo->uHash) {
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iEnd = iMid - 1;
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart = iMid + 1;
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (iStart <= iEnd);
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCATTRIBUTEINFO XFA_GetAttributeByID(XFA_ATTRIBUTE eName) {
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (eName < g_iXFAAttributeCount) ? (g_XFAAttributeData + eName) : NULL;
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL XFA_GetAttributeDefaultValue(void*& pValue,
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     XFA_ELEMENT eElement,
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     XFA_ATTRIBUTE eAttribute,
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     XFA_ATTRIBUTETYPE eType,
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD dwPacket) {
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttribute);
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pInfo == NULL) {
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwPacket && (dwPacket & pInfo->dwPackets) == 0) {
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pInfo->eType == eType) {
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pValue = pInfo->pDefValue;
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (pInfo->eType == XFA_ATTRIBUTETYPE_NOTSURE) {
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCNOTSUREATTRIBUTE pAttr =
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        XFA_GetNotsureAttribute(eElement, eAttribute, eType);
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pAttr) {
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pValue = pAttr->pValue;
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_ATTRIBUTEENUM XFA_GetAttributeDefaultValue_Enum(XFA_ELEMENT eElement,
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                    XFA_ATTRIBUTE eAttribute,
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                    FX_DWORD dwPacket) {
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* pValue;
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   XFA_ATTRIBUTETYPE_Enum, dwPacket)) {
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return XFA_ATTRIBUTEENUM_Unknown;
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideStringC XFA_GetAttributeDefaultValue_Cdata(XFA_ELEMENT eElement,
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                   XFA_ATTRIBUTE eAttribute,
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                   FX_DWORD dwPacket) {
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* pValue;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   XFA_ATTRIBUTETYPE_Cdata, dwPacket)) {
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (const FX_WCHAR*)pValue;
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL XFA_GetAttributeDefaultValue_Boolean(XFA_ELEMENT eElement,
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             XFA_ATTRIBUTE eAttribute,
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             FX_DWORD dwPacket) {
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* pValue;
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   XFA_ATTRIBUTETYPE_Boolean, dwPacket)) {
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (FX_BOOL)(uintptr_t)pValue;
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t XFA_GetAttributeDefaultValue_Integer(XFA_ELEMENT eElement,
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             XFA_ATTRIBUTE eAttribute,
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                             FX_DWORD dwPacket) {
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* pValue;
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   XFA_ATTRIBUTETYPE_Integer, dwPacket)) {
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (int32_t)(uintptr_t)pValue;
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_Measurement XFA_GetAttributeDefaultValue_Measure(XFA_ELEMENT eElement,
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                      XFA_ATTRIBUTE eAttribute,
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                      FX_DWORD dwPacket) {
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  void* pValue;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   XFA_ATTRIBUTETYPE_Measure, dwPacket)) {
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return *(CXFA_Measurement*)pValue;
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CXFA_Measurement();
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t XFA_GetElementCount() {
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return g_iXFAElementCount;
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCELEMENTINFO XFA_GetElementByName(const CFX_WideStringC& wsName) {
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = wsName.GetLength();
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLength == 0) {
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint32_t uHash = FX_HashCode_String_GetW(wsName.GetPtr(), iLength);
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = 0, iEnd = g_iXFAElementCount - 1;
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iMid = (iStart + iEnd) / 2;
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCELEMENTINFO pInfo = g_XFAElementData + iMid;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (uHash == pInfo->uHash) {
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pInfo;
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (uHash < pInfo->uHash) {
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iEnd = iMid - 1;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart = iMid + 1;
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (iStart <= iEnd);
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCELEMENTINFO XFA_GetElementByID(XFA_ELEMENT eName) {
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (eName < g_iXFAElementCount) ? (g_XFAElementData + eName) : NULL;
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst FX_WORD* XFA_GetElementChildren(XFA_ELEMENT eElement, int32_t& iCount) {
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (eElement >= g_iXFAElementCount) {
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCELEMENTHIERARCHY pElement = g_XFAElementChildrenIndex + eElement;
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCount = pElement->wCount;
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return g_XFAElementChildrenData + pElement->wStart;
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst uint8_t* XFA_GetElementAttributes(XFA_ELEMENT eElement, int32_t& iCount) {
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (eElement >= g_iXFAElementCount) {
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCELEMENTHIERARCHY pElement = g_XFAElementAttributeIndex + eElement;
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCount = pElement->wCount;
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return g_XFAElementAttributeData + pElement->wStart;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCATTRIBUTEINFO XFA_GetAttributeOfElement(XFA_ELEMENT eElement,
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               XFA_ATTRIBUTE eAttribute,
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               FX_DWORD dwPacket) {
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = 0;
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const uint8_t* pAttr = XFA_GetElementAttributes(eElement, iCount);
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pAttr == NULL || iCount < 1) {
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_DSPATemplate<uint8_t> search;
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t index = search.Lookup(eAttribute, pAttr, iCount);
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0) {
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCATTRIBUTEINFO pInfo = XFA_GetAttributeByID(eAttribute);
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(pInfo != NULL);
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwPacket == XFA_XDPPACKET_UNKNOWN) {
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pInfo;
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (dwPacket & pInfo->dwPackets) ? pInfo : NULL;
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCELEMENTINFO XFA_GetChildOfElement(XFA_ELEMENT eElement,
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         XFA_ELEMENT eChild,
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_DWORD dwPacket) {
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = 0;
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_WORD* pChild = XFA_GetElementChildren(eElement, iCount);
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pChild == NULL || iCount < 1) {
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_DSPATemplate<FX_WORD> search;
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t index = search.Lookup(eChild, pChild, iCount);
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0) {
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCELEMENTINFO pInfo = XFA_GetElementByID(eChild);
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(pInfo != NULL);
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwPacket == XFA_XDPPACKET_UNKNOWN) {
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pInfo;
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (dwPacket & pInfo->dwPackets) ? pInfo : NULL;
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCPROPERTY XFA_GetElementProperties(XFA_ELEMENT eElement,
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t& iCount) {
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (eElement >= g_iXFAElementCount) {
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCELEMENTHIERARCHY pElement = g_XFAElementPropertyIndex + eElement;
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iCount = pElement->wCount;
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return g_XFAElementPropertyData + pElement->wStart;
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCPROPERTY XFA_GetPropertyOfElement(XFA_ELEMENT eElement,
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         XFA_ELEMENT eProperty,
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_DWORD dwPacket) {
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = 0;
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCPROPERTY pProperty = XFA_GetElementProperties(eElement, iCount);
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pProperty == NULL || iCount < 1) {
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = 0, iEnd = iCount - 1, iMid;
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iMid = (iStart + iEnd) / 2;
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_ELEMENT eName = (XFA_ELEMENT)pProperty[iMid].eName;
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (eProperty == eName) {
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (eProperty < eName) {
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iEnd = iMid - 1;
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart = iMid + 1;
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (iStart <= iEnd);
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iStart > iEnd) {
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_LPCELEMENTINFO pInfo = XFA_GetElementByID(eProperty);
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(pInfo != NULL);
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwPacket == XFA_XDPPACKET_UNKNOWN) {
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pProperty + iMid;
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (dwPacket & pInfo->dwPackets) ? (pProperty + iMid) : NULL;
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCNOTSUREATTRIBUTE XFA_GetNotsureAttribute(XFA_ELEMENT eElement,
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                XFA_ATTRIBUTE eAttribute,
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                XFA_ATTRIBUTETYPE eType) {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = 0, iEnd = g_iXFANotsureCount - 1;
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iMid = (iStart + iEnd) / 2;
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCNOTSUREATTRIBUTE pAttr = g_XFANotsureAttributes + iMid;
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (eElement == pAttr->eElement) {
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pAttr->eAttribute == eAttribute) {
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return pAttr;
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return NULL;
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int32_t iBefore = iMid - 1;
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iBefore >= 0) {
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pAttr = g_XFANotsureAttributes + iBefore;
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          while (eElement == pAttr->eElement) {
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (pAttr->eAttribute == eAttribute) {
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                return pAttr;
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              }
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              return NULL;
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            iBefore--;
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (iBefore < 0) {
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pAttr = g_XFANotsureAttributes + iBefore;
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int32_t iAfter = iMid + 1;
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iAfter <= g_iXFANotsureCount - 1) {
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pAttr = g_XFANotsureAttributes + iAfter;
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          while (eElement == pAttr->eElement) {
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (pAttr->eAttribute == eAttribute) {
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              if (eType == XFA_ATTRIBUTETYPE_NOTSURE || eType == pAttr->eType) {
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                return pAttr;
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              }
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              return NULL;
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            iAfter++;
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (iAfter > g_iXFANotsureCount - 1) {
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              break;
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pAttr = g_XFANotsureAttributes + iAfter;
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return NULL;
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (eElement < pAttr->eElement) {
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iEnd = iMid - 1;
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iStart = iMid + 1;
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (iStart <= iEnd);
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t XFA_GetMethodCount() {
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return g_iSomMethodCount;
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCMETHODINFO XFA_GetMethodByName(XFA_ELEMENT eElement,
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      const CFX_WideStringC& wsMethodName) {
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = wsMethodName.GetLength();
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLength == 0) {
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iElementIndex = eElement;
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (iElementIndex != -1) {
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex;
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t icount = scriptIndex->wMethodCount;
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (icount == 0) {
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iElementIndex = scriptIndex->wParentIndex;
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint32_t uHash = FX_HashCode_String_GetW(wsMethodName.GetPtr(), iLength);
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iStart = scriptIndex->wMethodStart, iEnd = iStart + icount - 1;
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    do {
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t iMid = (iStart + iEnd) / 2;
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      XFA_LPCMETHODINFO pInfo = g_SomMethodData + iMid;
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (uHash == pInfo->uHash) {
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return pInfo;
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (uHash < pInfo->uHash) {
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iEnd = iMid - 1;
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iStart = iMid + 1;
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } while (iStart <= iEnd);
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iElementIndex = scriptIndex->wParentIndex;
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_LPCSCRIPTATTRIBUTEINFO XFA_GetScriptAttributeByName(
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_ELEMENT eElement,
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_WideStringC& wsAttributeName) {
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = wsAttributeName.GetLength();
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLength == 0) {
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iElementIndex = eElement;
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (iElementIndex != -1) {
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    XFA_LPCSCRIPTHIERARCHY scriptIndex = g_XFAScriptIndex + iElementIndex;
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t icount = scriptIndex->wAttributeCount;
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (icount == 0) {
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iElementIndex = scriptIndex->wParentIndex;
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint32_t uHash = FX_HashCode_String_GetW(wsAttributeName.GetPtr(), iLength);
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iStart = scriptIndex->wAttributeStart, iEnd = iStart + icount - 1;
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    do {
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t iMid = (iStart + iEnd) / 2;
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      XFA_LPCSCRIPTATTRIBUTEINFO pInfo = g_SomAttributeData + iMid;
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (uHash == pInfo->uHash) {
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return pInfo;
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (uHash < pInfo->uHash) {
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iEnd = iMid - 1;
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        iStart = iMid + 1;
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } while (iStart <= iEnd);
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iElementIndex = scriptIndex->wParentIndex;
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CXFA_Measurement::Set(const CFX_WideStringC& wsMeasure) {
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (wsMeasure.IsEmpty()) {
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_fValue = 0;
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eUnit = XFA_UNIT_Unknown;
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iUsedLen = 0;
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iOffset = (wsMeasure.GetAt(0) == L'=') ? 1 : 0;
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fValue = FX_wcstof(wsMeasure.GetPtr() + iOffset,
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              wsMeasure.GetLength() - iOffset, &iUsedLen);
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_UNIT eUnit = GetUnit(wsMeasure.Mid(iOffset + iUsedLen));
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Set(fValue, eUnit);
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_Measurement::ToString(CFX_WideString& wsMeasure) const {
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (GetUnit()) {
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Mm:
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8gmm", GetValue());
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Pt:
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8gpt", GetValue());
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_In:
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8gin", GetValue());
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Cm:
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8gcm", GetValue());
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Mp:
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8gmp", GetValue());
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Pc:
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8gpc", GetValue());
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Em:
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8gem", GetValue());
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Percent:
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8g%%", GetValue());
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMeasure.Format(L"%.8g", GetValue());
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_Measurement::ToUnit(XFA_UNIT eUnit, FX_FLOAT& fValue) const {
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fValue = GetValue();
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  XFA_UNIT eFrom = GetUnit();
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (eFrom == eUnit) {
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (eFrom) {
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Pt:
496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Mm:
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue *= 72 / 2.54f / 10;
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_In:
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue *= 72;
502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Cm:
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue *= 72 / 2.54f;
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Mp:
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue *= 0.001f;
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Pc:
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue *= 12.0f;
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue = 0;
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (eUnit) {
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Pt:
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Mm:
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue /= 72 / 2.54f / 10;
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_In:
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue /= 72;
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Cm:
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue /= 72 / 2.54f;
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Mp:
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue /= 0.001f;
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case XFA_UNIT_Pc:
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue /= 12.0f;
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fValue = 0;
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannXFA_UNIT CXFA_Measurement::GetUnit(const CFX_WideStringC& wsUnit) {
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (wsUnit == FX_WSTRC(L"mm")) {
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Mm;
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (wsUnit == FX_WSTRC(L"pt")) {
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Pt;
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (wsUnit == FX_WSTRC(L"in")) {
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_In;
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (wsUnit == FX_WSTRC(L"cm")) {
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Cm;
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (wsUnit == FX_WSTRC(L"pc")) {
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Pc;
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (wsUnit == FX_WSTRC(L"mp")) {
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Mp;
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (wsUnit == FX_WSTRC(L"em")) {
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Em;
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (wsUnit == FX_WSTRC(L"%")) {
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Percent;
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return XFA_UNIT_Unknown;
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* XFA_CreateWideTextRead(const CFX_WideString& wsBuffer) {
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return new CXFA_WideTextRead(wsBuffer);
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCXFA_WideTextRead::CXFA_WideTextRead(const CFX_WideString& wsBuffer)
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_wsBuffer(wsBuffer), m_iPosition(0), m_iRefCount(1) {}
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CXFA_WideTextRead::Release() {
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (--m_iRefCount < 1) {
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete this;
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CXFA_WideTextRead::Retain() {
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iRefCount++;
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return this;
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CXFA_WideTextRead::GetAccessModes() const {
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_STREAMACCESS_Read | FX_STREAMACCESS_Text;
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_WideTextRead::GetLength() const {
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_wsBuffer.GetLength() * sizeof(FX_WCHAR);
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_WideTextRead::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (eSeek) {
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Begin:
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = iOffset;
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Current:
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition += iOffset;
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_End:
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = m_wsBuffer.GetLength() + iOffset;
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < 0) {
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = 0;
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition > m_wsBuffer.GetLength()) {
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = m_wsBuffer.GetLength();
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetPosition();
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_WideTextRead::GetPosition() {
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition * sizeof(FX_WCHAR);
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CXFA_WideTextRead::IsEOF() const {
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition >= m_wsBuffer.GetLength();
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CXFA_WideTextRead::ReadString(FX_WCHAR* pStr,
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t iMaxLength,
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL& bEOS,
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t const* pByteSize) {
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iMaxLength > m_wsBuffer.GetLength() - m_iPosition) {
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iMaxLength = m_wsBuffer.GetLength() - m_iPosition;
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_wcsncpy(pStr, (const FX_WCHAR*)m_wsBuffer + m_iPosition, iMaxLength);
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition += iMaxLength;
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bEOS = IsEOF();
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iMaxLength;
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CXFA_WideTextRead::GetCodePage() const {
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (sizeof(FX_WCHAR) == 2) ? FX_CODEPAGE_UTF16LE : FX_CODEPAGE_UTF32LE;
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CXFA_WideTextRead::SetCodePage(FX_WORD wCodePage) {
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetCodePage();
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
625