Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Side by Side Diff: xfa/src/fxfa/parser/xfa_basic_imp.cpp

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

Powered by Google App Engine
This is Rietveld 408576698