summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjaepark <jaepark@google.com>2016-08-11 13:10:39 -0700
committerCommit bot <commit-bot@chromium.org>2016-08-11 13:10:39 -0700
commit2736276deff3abef9d6b226eb9f585abe1384591 (patch)
tree0edcff20dd023d8dceee6a83e3d4d14708af610f
parent445a94b089c155f79cc8602c724418898dc2a861 (diff)
downloadpdfium-2736276deff3abef9d6b226eb9f585abe1384591.tar.xz
Move CPDFSDK_Annot, CPDFSDK_BAAnnot and CPDFSDK_DateTime to their own files.
Review-Url: https://codereview.chromium.org/2236743002
-rw-r--r--BUILD.gn8
-rw-r--r--fpdfsdk/cpdfsdk_annot.cpp105
-rw-r--r--fpdfsdk/cpdfsdk_baannot.cpp (renamed from fpdfsdk/fsdk_baseannot.cpp)509
-rw-r--r--fpdfsdk/cpdfsdk_datetime.cpp405
-rw-r--r--fpdfsdk/formfiller/cba_fontmap.cpp2
-rw-r--r--fpdfsdk/fsdk_annothandler.cpp1
-rw-r--r--fpdfsdk/fsdk_baseform.cpp2
-rw-r--r--fpdfsdk/include/cpdfsdk_annot.h68
-rw-r--r--fpdfsdk/include/cpdfsdk_baannot.h (renamed from fpdfsdk/include/fsdk_baseannot.h)107
-rw-r--r--fpdfsdk/include/cpdfsdk_datetime.h52
-rw-r--r--fpdfsdk/include/fsdk_baseform.h3
-rw-r--r--fpdfsdk/include/fsdk_mgr.h2
-rw-r--r--pdfium.gyp8
13 files changed, 661 insertions, 611 deletions
diff --git a/BUILD.gn b/BUILD.gn
index d128719462..8d9dd8167e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -64,6 +64,9 @@ static_library("pdfium") {
sources = [
"fpdfsdk/cfx_systemhandler.cpp",
"fpdfsdk/cfx_systemhandler.h",
+ "fpdfsdk/cpdfsdk_annot.cpp",
+ "fpdfsdk/cpdfsdk_baannot.cpp",
+ "fpdfsdk/cpdfsdk_datetime.cpp",
"fpdfsdk/fpdf_dataavail.cpp",
"fpdfsdk/fpdf_ext.cpp",
"fpdfsdk/fpdf_flatten.cpp",
@@ -81,13 +84,14 @@ static_library("pdfium") {
"fpdfsdk/fpdfview.cpp",
"fpdfsdk/fsdk_actionhandler.cpp",
"fpdfsdk/fsdk_annothandler.cpp",
- "fpdfsdk/fsdk_baseannot.cpp",
"fpdfsdk/fsdk_baseform.cpp",
"fpdfsdk/fsdk_mgr.cpp",
"fpdfsdk/fsdk_pauseadapter.cpp",
+ "fpdfsdk/include/cpdfsdk_annot.h",
+ "fpdfsdk/include/cpdfsdk_baannot.h",
+ "fpdfsdk/include/cpdfsdk_datetime.h",
"fpdfsdk/include/fsdk_actionhandler.h",
"fpdfsdk/include/fsdk_annothandler.h",
- "fpdfsdk/include/fsdk_baseannot.h",
"fpdfsdk/include/fsdk_baseform.h",
"fpdfsdk/include/fsdk_pauseadapter.h",
"public/fpdf_dataavail.h",
diff --git a/fpdfsdk/cpdfsdk_annot.cpp b/fpdfsdk/cpdfsdk_annot.cpp
new file mode 100644
index 0000000000..e0abe6f54e
--- /dev/null
+++ b/fpdfsdk/cpdfsdk_annot.cpp
@@ -0,0 +1,105 @@
+// Copyright 2016 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 "fpdfsdk/include/cpdfsdk_annot.h"
+
+#include <algorithm>
+
+#include "fpdfsdk/include/fsdk_mgr.h"
+
+#ifdef PDF_ENABLE_XFA
+#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
+#endif // PDF_ENABLE_XFA
+
+namespace {
+
+const float kMinWidth = 1.0f;
+const float kMinHeight = 1.0f;
+
+} // namespace
+
+CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView)
+ : m_pPageView(pPageView), m_bSelected(FALSE), m_nTabOrder(-1) {}
+
+CPDFSDK_Annot::~CPDFSDK_Annot() {}
+
+#ifdef PDF_ENABLE_XFA
+
+FX_BOOL CPDFSDK_Annot::IsXFAField() {
+ return FALSE;
+}
+
+CXFA_FFWidget* CPDFSDK_Annot::GetXFAWidget() const {
+ return nullptr;
+}
+
+CPDFXFA_Page* CPDFSDK_Annot::GetPDFXFAPage() {
+ return m_pPageView ? m_pPageView->GetPDFXFAPage() : nullptr;
+}
+
+#endif // PDF_ENABLE_XFA
+
+FX_FLOAT CPDFSDK_Annot::GetMinWidth() const {
+ return kMinWidth;
+}
+
+FX_FLOAT CPDFSDK_Annot::GetMinHeight() const {
+ return kMinHeight;
+}
+
+int CPDFSDK_Annot::GetLayoutOrder() const {
+ return 5;
+}
+
+CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot() const {
+ return nullptr;
+}
+
+CFX_ByteString CPDFSDK_Annot::GetType() const {
+ return "";
+}
+
+CFX_ByteString CPDFSDK_Annot::GetSubType() const {
+ return "";
+}
+
+void CPDFSDK_Annot::SetRect(const CFX_FloatRect& rect) {}
+
+CFX_FloatRect CPDFSDK_Annot::GetRect() const {
+ return CFX_FloatRect();
+}
+
+void CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice,
+ CFX_Matrix* pUser2Device,
+ CPDF_RenderOptions* pOptions) {}
+
+FX_BOOL CPDFSDK_Annot::IsSelected() {
+ return m_bSelected;
+}
+
+void CPDFSDK_Annot::SetSelected(FX_BOOL bSelected) {
+ m_bSelected = bSelected;
+}
+
+int CPDFSDK_Annot::GetTabOrder() {
+ return m_nTabOrder;
+}
+
+void CPDFSDK_Annot::SetTabOrder(int iTabOrder) {
+ m_nTabOrder = iTabOrder;
+}
+
+UnderlyingPageType* CPDFSDK_Annot::GetUnderlyingPage() {
+#ifdef PDF_ENABLE_XFA
+ return GetPDFXFAPage();
+#else // PDF_ENABLE_XFA
+ return GetPDFPage();
+#endif // PDF_ENABLE_XFA
+}
+
+CPDF_Page* CPDFSDK_Annot::GetPDFPage() {
+ return m_pPageView ? m_pPageView->GetPDFPage() : nullptr;
+}
diff --git a/fpdfsdk/fsdk_baseannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index 21ba6a7a80..6a4ba86d94 100644
--- a/fpdfsdk/fsdk_baseannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -1,485 +1,18 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 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 <algorithm>
+#include "fpdfsdk/include/cpdfsdk_baannot.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
-#include "core/fxcrt/include/fx_ext.h"
-#include "core/fxge/include/cfx_renderdevice.h"
-#include "fpdfsdk/include/fsdk_baseannot.h"
-#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/cpdfsdk_datetime.h"
#include "fpdfsdk/include/fsdk_mgr.h"
-#ifdef PDF_ENABLE_XFA
-#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h"
-#endif // PDF_ENABLE_XFA
-
-namespace {
-
-const float kMinWidth = 1.0f;
-const float kMinHeight = 1.0f;
-
-int gAfxGetTimeZoneInSeconds(int8_t tzhour, uint8_t tzminute) {
- return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60);
-}
-
-bool gAfxIsLeapYear(int16_t year) {
- return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));
-}
-
-uint16_t gAfxGetYearDays(int16_t year) {
- return (gAfxIsLeapYear(year) ? 366 : 365);
-}
-
-uint8_t gAfxGetMonthDays(int16_t year, uint8_t month) {
- uint8_t mDays;
- switch (month) {
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- mDays = 31;
- break;
-
- case 4:
- case 6:
- case 9:
- case 11:
- mDays = 30;
- break;
-
- case 2:
- if (gAfxIsLeapYear(year))
- mDays = 29;
- else
- mDays = 28;
- break;
-
- default:
- mDays = 0;
- break;
- }
-
- return mDays;
-}
-
-} // namespace
-
-CPDFSDK_DateTime::CPDFSDK_DateTime() {
- ResetDateTime();
-}
-
-CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr) {
- ResetDateTime();
-
- FromPDFDateTimeString(dtStr);
-}
-
-CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime) {
- operator=(datetime);
-}
-
-CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st) {
- operator=(st);
-}
-
-void CPDFSDK_DateTime::ResetDateTime() {
- tzset();
-
- time_t curTime;
- time(&curTime);
- struct tm* newtime = localtime(&curTime);
-
- dt.year = newtime->tm_year + 1900;
- dt.month = newtime->tm_mon + 1;
- dt.day = newtime->tm_mday;
- dt.hour = newtime->tm_hour;
- dt.minute = newtime->tm_min;
- dt.second = newtime->tm_sec;
-}
-
-CPDFSDK_DateTime& CPDFSDK_DateTime::operator=(
- const CPDFSDK_DateTime& datetime) {
- FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME));
- return *this;
-}
-
-CPDFSDK_DateTime& CPDFSDK_DateTime::operator=(const FX_SYSTEMTIME& st) {
- tzset();
-
- dt.year = static_cast<int16_t>(st.wYear);
- dt.month = static_cast<uint8_t>(st.wMonth);
- dt.day = static_cast<uint8_t>(st.wDay);
- dt.hour = static_cast<uint8_t>(st.wHour);
- dt.minute = static_cast<uint8_t>(st.wMinute);
- dt.second = static_cast<uint8_t>(st.wSecond);
- return *this;
-}
-
-bool CPDFSDK_DateTime::operator==(const CPDFSDK_DateTime& datetime) const {
- return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0);
-}
-
-bool CPDFSDK_DateTime::operator!=(const CPDFSDK_DateTime& datetime) const {
- return !(*this == datetime);
-}
-
-time_t CPDFSDK_DateTime::ToTime_t() const {
- struct tm newtime;
-
- newtime.tm_year = dt.year - 1900;
- newtime.tm_mon = dt.month - 1;
- newtime.tm_mday = dt.day;
- newtime.tm_hour = dt.hour;
- newtime.tm_min = dt.minute;
- newtime.tm_sec = dt.second;
-
- return mktime(&newtime);
-}
-
-CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString(
- const CFX_ByteString& dtStr) {
- int strLength = dtStr.GetLength();
- if (strLength <= 0)
- return *this;
-
- int i = 0;
- while (i < strLength && !std::isdigit(dtStr[i]))
- ++i;
-
- if (i >= strLength)
- return *this;
-
- int j = 0;
- int k = 0;
- FX_CHAR ch;
- while (i < strLength && j < 4) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.year = static_cast<int16_t>(k);
- if (i >= strLength || j < 4)
- return *this;
-
- j = 0;
- k = 0;
- while (i < strLength && j < 2) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.month = static_cast<uint8_t>(k);
- if (i >= strLength || j < 2)
- return *this;
-
- j = 0;
- k = 0;
- while (i < strLength && j < 2) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.day = static_cast<uint8_t>(k);
- if (i >= strLength || j < 2)
- return *this;
-
- j = 0;
- k = 0;
- while (i < strLength && j < 2) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.hour = static_cast<uint8_t>(k);
- if (i >= strLength || j < 2)
- return *this;
-
- j = 0;
- k = 0;
- while (i < strLength && j < 2) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.minute = static_cast<uint8_t>(k);
- if (i >= strLength || j < 2)
- return *this;
-
- j = 0;
- k = 0;
- while (i < strLength && j < 2) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.second = static_cast<uint8_t>(k);
- if (i >= strLength || j < 2)
- return *this;
-
- ch = dtStr[i++];
- if (ch != '-' && ch != '+')
- return *this;
- if (ch == '-')
- dt.tzHour = -1;
- else
- dt.tzHour = 1;
- j = 0;
- k = 0;
- while (i < strLength && j < 2) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.tzHour *= static_cast<int8_t>(k);
- if (i >= strLength || j < 2)
- return *this;
-
- if (dtStr[i++] != '\'')
- return *this;
- j = 0;
- k = 0;
- while (i < strLength && j < 2) {
- ch = dtStr[i];
- k = k * 10 + FXSYS_toDecimalDigit(ch);
- j++;
- if (!std::isdigit(ch))
- break;
- i++;
- }
- dt.tzMinute = static_cast<uint8_t>(k);
- return *this;
-}
-
-CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString() {
- CFX_ByteString str1;
- str1.Format("%04d-%02u-%02u %02u:%02u:%02u ", dt.year, dt.month, dt.day,
- dt.hour, dt.minute, dt.second);
- if (dt.tzHour < 0)
- str1 += "-";
- else
- str1 += "+";
- CFX_ByteString str2;
- str2.Format("%02d:%02u", std::abs(static_cast<int>(dt.tzHour)), dt.tzMinute);
- return str1 + str2;
-}
-
-CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString() {
- CFX_ByteString dtStr;
- char tempStr[32];
- memset(tempStr, 0, sizeof(tempStr));
- FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02u%02u%02u%02u%02u",
- dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
- dtStr = CFX_ByteString(tempStr);
- if (dt.tzHour < 0)
- dtStr += CFX_ByteString("-");
- else
- dtStr += CFX_ByteString("+");
- memset(tempStr, 0, sizeof(tempStr));
- FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02u'",
- std::abs(static_cast<int>(dt.tzHour)), dt.tzMinute);
- dtStr += CFX_ByteString(tempStr);
- return dtStr;
-}
-
-void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st) {
- time_t t = this->ToTime_t();
- struct tm* pTime = localtime(&t);
- if (pTime) {
- st.wYear = static_cast<uint16_t>(pTime->tm_year) + 1900;
- st.wMonth = static_cast<uint16_t>(pTime->tm_mon) + 1;
- st.wDay = static_cast<uint16_t>(pTime->tm_mday);
- st.wDayOfWeek = static_cast<uint16_t>(pTime->tm_wday);
- st.wHour = static_cast<uint16_t>(pTime->tm_hour);
- st.wMinute = static_cast<uint16_t>(pTime->tm_min);
- st.wSecond = static_cast<uint16_t>(pTime->tm_sec);
- st.wMilliseconds = 0;
- }
-}
-
-CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT() const {
- CPDFSDK_DateTime new_dt = *this;
- new_dt.AddSeconds(
- -gAfxGetTimeZoneInSeconds(new_dt.dt.tzHour, new_dt.dt.tzMinute));
- new_dt.dt.tzHour = 0;
- new_dt.dt.tzMinute = 0;
- return new_dt;
-}
-
-CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days) {
- if (days == 0)
- return *this;
-
- int16_t y = dt.year;
- uint8_t m = dt.month;
- uint8_t d = dt.day;
-
- int ldays = days;
- if (ldays > 0) {
- int16_t yy = y;
- if ((static_cast<uint16_t>(m) * 100 + d) > 300)
- yy++;
- int ydays = gAfxGetYearDays(yy);
- int mdays;
- while (ldays >= ydays) {
- y++;
- ldays -= ydays;
- yy++;
- mdays = gAfxGetMonthDays(y, m);
- if (d > mdays) {
- m++;
- d -= mdays;
- }
- ydays = gAfxGetYearDays(yy);
- }
- mdays = gAfxGetMonthDays(y, m) - d + 1;
- while (ldays >= mdays) {
- ldays -= mdays;
- m++;
- d = 1;
- mdays = gAfxGetMonthDays(y, m);
- }
- d += ldays;
- } else {
- ldays *= -1;
- int16_t yy = y;
- if ((static_cast<uint16_t>(m) * 100 + d) < 300)
- yy--;
- int ydays = gAfxGetYearDays(yy);
- while (ldays >= ydays) {
- y--;
- ldays -= ydays;
- yy--;
- int mdays = gAfxGetMonthDays(y, m);
- if (d > mdays) {
- m++;
- d -= mdays;
- }
- ydays = gAfxGetYearDays(yy);
- }
- while (ldays >= d) {
- ldays -= d;
- m--;
- d = gAfxGetMonthDays(y, m);
- }
- d -= ldays;
- }
-
- dt.year = y;
- dt.month = m;
- dt.day = d;
-
- return *this;
-}
-
-CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds) {
- if (seconds == 0)
- return *this;
-
- int n;
- int days;
-
- n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds;
- if (n < 0) {
- days = (n - 86399) / 86400;
- n -= days * 86400;
- } else {
- days = n / 86400;
- n %= 86400;
- }
- dt.hour = static_cast<uint8_t>(n / 3600);
- dt.hour %= 24;
- n %= 3600;
- dt.minute = static_cast<uint8_t>(n / 60);
- dt.second = static_cast<uint8_t>(n % 60);
- if (days != 0)
- AddDays(days);
-
- return *this;
-}
-
-CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView)
- : m_pPageView(pPageView), m_bSelected(FALSE), m_nTabOrder(-1) {}
-
-CPDFSDK_Annot::~CPDFSDK_Annot() {}
-
-#ifdef PDF_ENABLE_XFA
-
-FX_BOOL CPDFSDK_Annot::IsXFAField() {
- return FALSE;
-}
-
-CXFA_FFWidget* CPDFSDK_Annot::GetXFAWidget() const {
- return nullptr;
-}
-
-#endif // PDF_ENABLE_XFA
-
-FX_FLOAT CPDFSDK_Annot::GetMinWidth() const {
- return kMinWidth;
-}
-
-FX_FLOAT CPDFSDK_Annot::GetMinHeight() const {
- return kMinHeight;
-}
-
-int CPDFSDK_Annot::GetLayoutOrder() const {
- return 5;
-}
-
-CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot() const {
- return nullptr;
-}
-
-CFX_ByteString CPDFSDK_Annot::GetType() const {
- return "";
-}
-
-CFX_ByteString CPDFSDK_Annot::GetSubType() const {
- return "";
-}
-
-void CPDFSDK_Annot::SetRect(const CFX_FloatRect& rect) {}
-
-CFX_FloatRect CPDFSDK_Annot::GetRect() const {
- return CFX_FloatRect();
-}
-
-void CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice,
- CFX_Matrix* pUser2Device,
- CPDF_RenderOptions* pOptions) {}
-
CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot,
CPDFSDK_PageView* pPageView)
: CPDFSDK_Annot(pPageView), m_pAnnot(pAnnot) {}
@@ -490,22 +23,6 @@ CPDF_Annot* CPDFSDK_BAAnnot::GetPDFAnnot() const {
return m_pAnnot;
}
-FX_BOOL CPDFSDK_Annot::IsSelected() {
- return m_bSelected;
-}
-
-void CPDFSDK_Annot::SetSelected(FX_BOOL bSelected) {
- m_bSelected = bSelected;
-}
-
-int CPDFSDK_Annot::GetTabOrder() {
- return m_nTabOrder;
-}
-
-void CPDFSDK_Annot::SetTabOrder(int iTabOrder) {
- m_nTabOrder = iTabOrder;
-}
-
CPDF_Dictionary* CPDFSDK_BAAnnot::GetAnnotDict() const {
return m_pAnnot->GetAnnotDict();
}
@@ -885,23 +402,3 @@ void CPDFSDK_BAAnnot::Annot_OnDraw(CFX_RenderDevice* pDevice,
m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device,
CPDF_Annot::Normal, nullptr);
}
-
-UnderlyingPageType* CPDFSDK_Annot::GetUnderlyingPage() {
-#ifdef PDF_ENABLE_XFA
- return GetPDFXFAPage();
-#else // PDF_ENABLE_XFA
- return GetPDFPage();
-#endif // PDF_ENABLE_XFA
-}
-
-CPDF_Page* CPDFSDK_Annot::GetPDFPage() {
- return m_pPageView ? m_pPageView->GetPDFPage() : nullptr;
-}
-
-#ifdef PDF_ENABLE_XFA
-
-CPDFXFA_Page* CPDFSDK_Annot::GetPDFXFAPage() {
- return m_pPageView ? m_pPageView->GetPDFXFAPage() : nullptr;
-}
-
-#endif // PDF_ENABLE_XFA
diff --git a/fpdfsdk/cpdfsdk_datetime.cpp b/fpdfsdk/cpdfsdk_datetime.cpp
new file mode 100644
index 0000000000..0dcf6b2055
--- /dev/null
+++ b/fpdfsdk/cpdfsdk_datetime.cpp
@@ -0,0 +1,405 @@
+// Copyright 2016 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 "fpdfsdk/include/cpdfsdk_datetime.h"
+
+#include "core/fxcrt/include/fx_ext.h"
+
+namespace {
+
+int GetTimeZoneInSeconds(int8_t tzhour, uint8_t tzminute) {
+ return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60);
+}
+
+bool IsLeapYear(int16_t year) {
+ return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));
+}
+
+uint16_t GetYearDays(int16_t year) {
+ return (IsLeapYear(year) ? 366 : 365);
+}
+
+uint8_t GetMonthDays(int16_t year, uint8_t month) {
+ uint8_t mDays;
+ switch (month) {
+ case 1:
+ case 3:
+ case 5:
+ case 7:
+ case 8:
+ case 10:
+ case 12:
+ mDays = 31;
+ break;
+
+ case 4:
+ case 6:
+ case 9:
+ case 11:
+ mDays = 30;
+ break;
+
+ case 2:
+ if (IsLeapYear(year))
+ mDays = 29;
+ else
+ mDays = 28;
+ break;
+
+ default:
+ mDays = 0;
+ break;
+ }
+
+ return mDays;
+}
+
+} // namespace
+
+CPDFSDK_DateTime::CPDFSDK_DateTime() {
+ ResetDateTime();
+}
+
+CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr) {
+ ResetDateTime();
+
+ FromPDFDateTimeString(dtStr);
+}
+
+CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime) {
+ FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME));
+}
+
+CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st) {
+ tzset();
+
+ dt.year = static_cast<int16_t>(st.wYear);
+ dt.month = static_cast<uint8_t>(st.wMonth);
+ dt.day = static_cast<uint8_t>(st.wDay);
+ dt.hour = static_cast<uint8_t>(st.wHour);
+ dt.minute = static_cast<uint8_t>(st.wMinute);
+ dt.second = static_cast<uint8_t>(st.wSecond);
+}
+
+void CPDFSDK_DateTime::ResetDateTime() {
+ tzset();
+
+ time_t curTime;
+ time(&curTime);
+ struct tm* newtime = localtime(&curTime);
+
+ dt.year = newtime->tm_year + 1900;
+ dt.month = newtime->tm_mon + 1;
+ dt.day = newtime->tm_mday;
+ dt.hour = newtime->tm_hour;
+ dt.minute = newtime->tm_min;
+ dt.second = newtime->tm_sec;
+}
+
+bool CPDFSDK_DateTime::operator==(const CPDFSDK_DateTime& datetime) const {
+ return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0);
+}
+
+bool CPDFSDK_DateTime::operator!=(const CPDFSDK_DateTime& datetime) const {
+ return !(*this == datetime);
+}
+
+time_t CPDFSDK_DateTime::ToTime_t() const {
+ struct tm newtime;
+
+ newtime.tm_year = dt.year - 1900;
+ newtime.tm_mon = dt.month - 1;
+ newtime.tm_mday = dt.day;
+ newtime.tm_hour = dt.hour;
+ newtime.tm_min = dt.minute;
+ newtime.tm_sec = dt.second;
+
+ return mktime(&newtime);
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString(
+ const CFX_ByteString& dtStr) {
+ int strLength = dtStr.GetLength();
+ if (strLength <= 0)
+ return *this;
+
+ int i = 0;
+ while (i < strLength && !std::isdigit(dtStr[i]))
+ ++i;
+
+ if (i >= strLength)
+ return *this;
+
+ int j = 0;
+ int k = 0;
+ FX_CHAR ch;
+ while (i < strLength && j < 4) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.year = static_cast<int16_t>(k);
+ if (i >= strLength || j < 4)
+ return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.month = static_cast<uint8_t>(k);
+ if (i >= strLength || j < 2)
+ return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.day = static_cast<uint8_t>(k);
+ if (i >= strLength || j < 2)
+ return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.hour = static_cast<uint8_t>(k);
+ if (i >= strLength || j < 2)
+ return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.minute = static_cast<uint8_t>(k);
+ if (i >= strLength || j < 2)
+ return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.second = static_cast<uint8_t>(k);
+ if (i >= strLength || j < 2)
+ return *this;
+
+ ch = dtStr[i++];
+ if (ch != '-' && ch != '+')
+ return *this;
+ if (ch == '-')
+ dt.tzHour = -1;
+ else
+ dt.tzHour = 1;
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.tzHour *= static_cast<int8_t>(k);
+ if (i >= strLength || j < 2)
+ return *this;
+
+ if (dtStr[i++] != '\'')
+ return *this;
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2) {
+ ch = dtStr[i];
+ k = k * 10 + FXSYS_toDecimalDigit(ch);
+ j++;
+ if (!std::isdigit(ch))
+ break;
+ i++;
+ }
+ dt.tzMinute = static_cast<uint8_t>(k);
+ return *this;
+}
+
+CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString() {
+ CFX_ByteString str1;
+ str1.Format("%04d-%02u-%02u %02u:%02u:%02u ", dt.year, dt.month, dt.day,
+ dt.hour, dt.minute, dt.second);
+ if (dt.tzHour < 0)
+ str1 += "-";
+ else
+ str1 += "+";
+ CFX_ByteString str2;
+ str2.Format("%02d:%02u", std::abs(static_cast<int>(dt.tzHour)), dt.tzMinute);
+ return str1 + str2;
+}
+
+CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString() {
+ CFX_ByteString dtStr;
+ char tempStr[32];
+ memset(tempStr, 0, sizeof(tempStr));
+ FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02u%02u%02u%02u%02u",
+ dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
+ dtStr = CFX_ByteString(tempStr);
+ if (dt.tzHour < 0)
+ dtStr += CFX_ByteString("-");
+ else
+ dtStr += CFX_ByteString("+");
+ memset(tempStr, 0, sizeof(tempStr));
+ FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02u'",
+ std::abs(static_cast<int>(dt.tzHour)), dt.tzMinute);
+ dtStr += CFX_ByteString(tempStr);
+ return dtStr;
+}
+
+void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st) {
+ time_t t = this->ToTime_t();
+ struct tm* pTime = localtime(&t);
+
+ if (!pTime)
+ return;
+
+ st.wYear = static_cast<uint16_t>(pTime->tm_year) + 1900;
+ st.wMonth = static_cast<uint16_t>(pTime->tm_mon) + 1;
+ st.wDay = static_cast<uint16_t>(pTime->tm_mday);
+ st.wDayOfWeek = static_cast<uint16_t>(pTime->tm_wday);
+ st.wHour = static_cast<uint16_t>(pTime->tm_hour);
+ st.wMinute = static_cast<uint16_t>(pTime->tm_min);
+ st.wSecond = static_cast<uint16_t>(pTime->tm_sec);
+ st.wMilliseconds = 0;
+}
+
+CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT() const {
+ CPDFSDK_DateTime new_dt = *this;
+ new_dt.AddSeconds(
+ -GetTimeZoneInSeconds(new_dt.dt.tzHour, new_dt.dt.tzMinute));
+ new_dt.dt.tzHour = 0;
+ new_dt.dt.tzMinute = 0;
+ return new_dt;
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days) {
+ if (days == 0)
+ return *this;
+
+ int16_t y = dt.year;
+ uint8_t m = dt.month;
+ uint8_t d = dt.day;
+
+ int ldays = days;
+ if (ldays > 0) {
+ int16_t yy = y;
+ if ((static_cast<uint16_t>(m) * 100 + d) > 300)
+ yy++;
+ int ydays = GetYearDays(yy);
+ int mdays;
+ while (ldays >= ydays) {
+ y++;
+ ldays -= ydays;
+ yy++;
+ mdays = GetMonthDays(y, m);
+ if (d > mdays) {
+ m++;
+ d -= mdays;
+ }
+ ydays = GetYearDays(yy);
+ }
+ mdays = GetMonthDays(y, m) - d + 1;
+ while (ldays >= mdays) {
+ ldays -= mdays;
+ m++;
+ d = 1;
+ mdays = GetMonthDays(y, m);
+ }
+ d += ldays;
+ } else {
+ ldays *= -1;
+ int16_t yy = y;
+ if ((static_cast<uint16_t>(m) * 100 + d) < 300)
+ yy--;
+ int ydays = GetYearDays(yy);
+ while (ldays >= ydays) {
+ y--;
+ ldays -= ydays;
+ yy--;
+ int mdays = GetMonthDays(y, m);
+ if (d > mdays) {
+ m++;
+ d -= mdays;
+ }
+ ydays = GetYearDays(yy);
+ }
+ while (ldays >= d) {
+ ldays -= d;
+ m--;
+ d = GetMonthDays(y, m);
+ }
+ d -= ldays;
+ }
+
+ dt.year = y;
+ dt.month = m;
+ dt.day = d;
+
+ return *this;
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds) {
+ if (seconds == 0)
+ return *this;
+
+ int n;
+ int days;
+
+ n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds;
+ if (n < 0) {
+ days = (n - 86399) / 86400;
+ n -= days * 86400;
+ } else {
+ days = n / 86400;
+ n %= 86400;
+ }
+ dt.hour = static_cast<uint8_t>(n / 3600);
+ dt.hour %= 24;
+ n %= 3600;
+ dt.minute = static_cast<uint8_t>(n / 60);
+ dt.second = static_cast<uint8_t>(n % 60);
+ if (days != 0)
+ AddDays(days);
+
+ return *this;
+}
diff --git a/fpdfsdk/formfiller/cba_fontmap.cpp b/fpdfsdk/formfiller/cba_fontmap.cpp
index 563078dd54..97590d20dd 100644
--- a/fpdfsdk/formfiller/cba_fontmap.cpp
+++ b/fpdfsdk/formfiller/cba_fontmap.cpp
@@ -13,7 +13,7 @@
#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
#include "core/fpdfdoc/include/cpdf_formfield.h"
-#include "fpdfsdk/include/fsdk_baseannot.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
CBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot,
CFX_SystemHandler* pSystemHandler)
diff --git a/fpdfsdk/fsdk_annothandler.cpp b/fpdfsdk/fsdk_annothandler.cpp
index 6216ab1c28..5e65a1f947 100644
--- a/fpdfsdk/fsdk_annothandler.cpp
+++ b/fpdfsdk/fsdk_annothandler.cpp
@@ -14,6 +14,7 @@
#include "core/fpdfdoc/include/cpdf_interform.h"
#include "core/fxge/include/cfx_renderdevice.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
+#include "fpdfsdk/include/cpdfsdk_datetime.h"
#include "fpdfsdk/include/fsdk_define.h"
#include "fpdfsdk/include/fsdk_mgr.h"
diff --git a/fpdfsdk/fsdk_baseform.cpp b/fpdfsdk/fsdk_baseform.cpp
index c5c6187c4e..4b12d78022 100644
--- a/fpdfsdk/fsdk_baseform.cpp
+++ b/fpdfsdk/fsdk_baseform.cpp
@@ -23,8 +23,8 @@
#include "core/fxge/include/cfx_renderdevice.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
#include "fpdfsdk/fxedit/include/fxet_edit.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
#include "fpdfsdk/include/fsdk_actionhandler.h"
-#include "fpdfsdk/include/fsdk_baseannot.h"
#include "fpdfsdk/include/fsdk_define.h"
#include "fpdfsdk/include/fsdk_mgr.h"
#include "fpdfsdk/javascript/ijs_context.h"
diff --git a/fpdfsdk/include/cpdfsdk_annot.h b/fpdfsdk/include/cpdfsdk_annot.h
new file mode 100644
index 0000000000..5f5cce4728
--- /dev/null
+++ b/fpdfsdk/include/cpdfsdk_annot.h
@@ -0,0 +1,68 @@
+// Copyright 2016 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
+
+#ifndef FPDFSDK_INCLUDE_CPDFSDK_ANNOT_H_
+#define FPDFSDK_INCLUDE_CPDFSDK_ANNOT_H_
+
+#include "core/fpdfdoc/include/cpdf_aaction.h"
+#include "core/fpdfdoc/include/cpdf_annot.h"
+#include "core/fpdfdoc/include/cpdf_defaultappearance.h"
+#include "core/fxcrt/include/fx_basic.h"
+#include "fpdfsdk/cfx_systemhandler.h"
+#include "fpdfsdk/include/fsdk_common.h"
+#include "fpdfsdk/include/fsdk_define.h"
+
+class CFX_Matrix;
+class CFX_RenderDevice;
+class CPDF_Page;
+class CPDF_RenderOptions;
+class CPDFSDK_PageView;
+
+class CPDFSDK_Annot {
+ public:
+ explicit CPDFSDK_Annot(CPDFSDK_PageView* pPageView);
+ virtual ~CPDFSDK_Annot();
+
+#ifdef PDF_ENABLE_XFA
+ virtual FX_BOOL IsXFAField();
+ virtual CXFA_FFWidget* GetXFAWidget() const;
+#endif // PDF_ENABLE_XFA
+
+ virtual FX_FLOAT GetMinWidth() const;
+ virtual FX_FLOAT GetMinHeight() const;
+ virtual int GetLayoutOrder() const;
+ virtual CPDF_Annot* GetPDFAnnot() const;
+ virtual CFX_ByteString GetType() const;
+ virtual CFX_ByteString GetSubType() const;
+ virtual CFX_FloatRect GetRect() const;
+
+ virtual void SetRect(const CFX_FloatRect& rect);
+ virtual void Annot_OnDraw(CFX_RenderDevice* pDevice,
+ CFX_Matrix* pUser2Device,
+ CPDF_RenderOptions* pOptions);
+
+ UnderlyingPageType* GetUnderlyingPage();
+ CPDF_Page* GetPDFPage();
+#ifdef PDF_ENABLE_XFA
+ CPDFXFA_Page* GetPDFXFAPage();
+#endif // PDF_ENABLE_XFA
+
+ void SetPage(CPDFSDK_PageView* pPageView);
+ CPDFSDK_PageView* GetPageView() const { return m_pPageView; }
+
+ int GetTabOrder();
+ void SetTabOrder(int iTabOrder);
+
+ FX_BOOL IsSelected();
+ void SetSelected(FX_BOOL bSelected);
+
+ protected:
+ CPDFSDK_PageView* m_pPageView;
+ FX_BOOL m_bSelected;
+ int m_nTabOrder;
+};
+
+#endif // FPDFSDK_INCLUDE_CPDFSDK_ANNOT_H_
diff --git a/fpdfsdk/include/fsdk_baseannot.h b/fpdfsdk/include/cpdfsdk_baannot.h
index 83bb02de1c..abe23fe1b9 100644
--- a/fpdfsdk/include/fsdk_baseannot.h
+++ b/fpdfsdk/include/cpdfsdk_baannot.h
@@ -4,110 +4,23 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-#ifndef FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_
-#define FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_
-
-#if _FX_OS_ == _FX_ANDROID_
-#include "time.h"
-#else
-#include <ctime>
-#endif
+#ifndef FPDFSDK_INCLUDE_CPDFSDK_BAANNOT_H_
+#define FPDFSDK_INCLUDE_CPDFSDK_BAANNOT_H_
#include "core/fpdfdoc/include/cpdf_aaction.h"
+#include "core/fpdfdoc/include/cpdf_action.h"
#include "core/fpdfdoc/include/cpdf_annot.h"
#include "core/fpdfdoc/include/cpdf_defaultappearance.h"
-#include "core/fxcrt/include/fx_basic.h"
+#include "core/fxcrt/include/fx_coordinates.h"
+#include "core/fxcrt/include/fx_string.h"
#include "fpdfsdk/cfx_systemhandler.h"
-#include "fpdfsdk/include/fsdk_common.h"
-#include "fpdfsdk/include/fsdk_define.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
-class CPDFSDK_PageView;
-class CPDF_Page;
class CFX_Matrix;
-class CPDF_RenderOptions;
class CFX_RenderDevice;
-
-class CPDFSDK_DateTime {
- public:
- CPDFSDK_DateTime();
- explicit CPDFSDK_DateTime(const CFX_ByteString& dtStr);
- explicit CPDFSDK_DateTime(const FX_SYSTEMTIME& st);
- CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime);
-
- CPDFSDK_DateTime& operator=(const CPDFSDK_DateTime& datetime);
- CPDFSDK_DateTime& operator=(const FX_SYSTEMTIME& st);
- bool operator==(const CPDFSDK_DateTime& datetime) const;
- bool operator!=(const CPDFSDK_DateTime& datetime) const;
-
- CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr);
- CFX_ByteString ToCommonDateTimeString();
- CFX_ByteString ToPDFDateTimeString();
- void ToSystemTime(FX_SYSTEMTIME& st);
- time_t ToTime_t() const;
- CPDFSDK_DateTime ToGMT() const;
- CPDFSDK_DateTime& AddDays(short days);
- CPDFSDK_DateTime& AddSeconds(int seconds);
-
- void ResetDateTime();
-
- struct FX_DATETIME {
- int16_t year;
- uint8_t month;
- uint8_t day;
- uint8_t hour;
- uint8_t minute;
- uint8_t second;
- int8_t tzHour;
- uint8_t tzMinute;
- } dt;
-};
-
-class CPDFSDK_Annot {
- public:
- explicit CPDFSDK_Annot(CPDFSDK_PageView* pPageView);
- virtual ~CPDFSDK_Annot();
-
-#ifdef PDF_ENABLE_XFA
- virtual FX_BOOL IsXFAField();
- virtual CXFA_FFWidget* GetXFAWidget() const;
-#endif // PDF_ENABLE_XFA
-
- virtual FX_FLOAT GetMinWidth() const;
- virtual FX_FLOAT GetMinHeight() const;
- // define layout order to 5.
- virtual int GetLayoutOrder() const;
- virtual CPDF_Annot* GetPDFAnnot() const;
- virtual CFX_ByteString GetType() const;
- virtual CFX_ByteString GetSubType() const;
- virtual CFX_FloatRect GetRect() const;
-
- virtual void SetRect(const CFX_FloatRect& rect);
- virtual void Annot_OnDraw(CFX_RenderDevice* pDevice,
- CFX_Matrix* pUser2Device,
- CPDF_RenderOptions* pOptions);
-
- UnderlyingPageType* GetUnderlyingPage();
- CPDF_Page* GetPDFPage();
-#ifdef PDF_ENABLE_XFA
- CPDFXFA_Page* GetPDFXFAPage();
-#endif // PDF_ENABLE_XFA
-
- void SetPage(CPDFSDK_PageView* pPageView);
- CPDFSDK_PageView* GetPageView() const { return m_pPageView; }
-
- // Tab Order
- int GetTabOrder();
- void SetTabOrder(int iTabOrder);
-
- // Selection
- FX_BOOL IsSelected();
- void SetSelected(FX_BOOL bSelected);
-
- protected:
- CPDFSDK_PageView* m_pPageView;
- FX_BOOL m_bSelected;
- int m_nTabOrder;
-};
+class CPDF_Dictionary;
+class CPDF_RenderOptions;
+class CPDFSDK_PageView;
class CPDFSDK_BAAnnot : public CPDFSDK_Annot {
public:
@@ -188,4 +101,4 @@ class CPDFSDK_BAAnnot : public CPDFSDK_Annot {
CPDF_Annot* m_pAnnot;
};
-#endif // FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_
+#endif // FPDFSDK_INCLUDE_CPDFSDK_BAANNOT_H_
diff --git a/fpdfsdk/include/cpdfsdk_datetime.h b/fpdfsdk/include/cpdfsdk_datetime.h
new file mode 100644
index 0000000000..785d96adc4
--- /dev/null
+++ b/fpdfsdk/include/cpdfsdk_datetime.h
@@ -0,0 +1,52 @@
+// Copyright 2016 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
+
+#ifndef FPDFSDK_INCLUDE_CPDFSDK_DATETIME_H_
+#define FPDFSDK_INCLUDE_CPDFSDK_DATETIME_H_
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+#include "fpdfsdk/cfx_systemhandler.h"
+
+class CPDFSDK_DateTime {
+ public:
+ CPDFSDK_DateTime();
+ explicit CPDFSDK_DateTime(const CFX_ByteString& dtStr);
+ explicit CPDFSDK_DateTime(const FX_SYSTEMTIME& st);
+ CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime);
+
+ bool operator==(const CPDFSDK_DateTime& datetime) const;
+ bool operator!=(const CPDFSDK_DateTime& datetime) const;
+
+ CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr);
+ CFX_ByteString ToCommonDateTimeString();
+ CFX_ByteString ToPDFDateTimeString();
+ void ToSystemTime(FX_SYSTEMTIME& st);
+ time_t ToTime_t() const;
+ CPDFSDK_DateTime ToGMT() const;
+ CPDFSDK_DateTime& AddDays(short days);
+ CPDFSDK_DateTime& AddSeconds(int seconds);
+
+ void ResetDateTime();
+
+ private:
+ struct FX_DATETIME {
+ int16_t year;
+ uint8_t month;
+ uint8_t day;
+ uint8_t hour;
+ uint8_t minute;
+ uint8_t second;
+ int8_t tzHour;
+ uint8_t tzMinute;
+ } dt;
+};
+
+#endif // FPDFSDK_INCLUDE_CPDFSDK_DATETIME_H_
diff --git a/fpdfsdk/include/fsdk_baseform.h b/fpdfsdk/include/fsdk_baseform.h
index d386c7fa2d..c5f45e75ae 100644
--- a/fpdfsdk/include/fsdk_baseform.h
+++ b/fpdfsdk/include/fsdk_baseform.h
@@ -14,7 +14,8 @@
#include "core/fpdfdoc/include/ipdf_formnotify.h"
#include "core/fxcrt/include/fx_basic.h"
#include "core/fxge/include/fx_dib.h"
-#include "fpdfsdk/include/fsdk_baseannot.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
+#include "fpdfsdk/include/cpdfsdk_baannot.h"
#if _FX_OS_ == _FX_ANDROID_
#include "time.h"
diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/fsdk_mgr.h
index 1c180db57f..1389d6cbbf 100644
--- a/fpdfsdk/include/fsdk_mgr.h
+++ b/fpdfsdk/include/fsdk_mgr.h
@@ -15,9 +15,9 @@
#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
#include "core/fpdfdoc/include/cpdf_occontext.h"
#include "fpdfsdk/cfx_systemhandler.h"
+#include "fpdfsdk/include/cpdfsdk_annot.h"
#include "fpdfsdk/include/fsdk_actionhandler.h"
#include "fpdfsdk/include/fsdk_annothandler.h"
-#include "fpdfsdk/include/fsdk_baseannot.h"
#include "fpdfsdk/include/fsdk_baseform.h"
#include "fpdfsdk/include/fsdk_common.h"
#include "fpdfsdk/include/fsdk_define.h"
diff --git a/pdfium.gyp b/pdfium.gyp
index 3e415939d4..1cc8758bd9 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -86,11 +86,16 @@
'sources': [
'fpdfsdk/cfx_systemhandler.cpp',
'fpdfsdk/cfx_systemhandler.h',
+ 'fpdfsdk/include/cpdfsdk_annot.h',
+ 'fpdfsdk/include/cpdfsdk_baannot.h',
+ 'fpdfsdk/include/cpdfsdk_datetime.h',
'fpdfsdk/include/fsdk_actionhandler.h',
'fpdfsdk/include/fsdk_annothandler.h',
- 'fpdfsdk/include/fsdk_baseannot.h',
'fpdfsdk/include/fsdk_baseform.h',
'fpdfsdk/include/fsdk_pauseadapter.h',
+ 'fpdfsdk/cpdfsdk_annot.cpp',
+ 'fpdfsdk/cpdfsdk_baannot.cpp',
+ 'fpdfsdk/cpdfsdk_datetime.cpp',
'fpdfsdk/fpdfdoc.cpp',
'fpdfsdk/fpdfeditimg.cpp',
'fpdfsdk/fpdfeditpage.cpp',
@@ -108,7 +113,6 @@
'fpdfsdk/fpdf_transformpage.cpp',
'fpdfsdk/fsdk_actionhandler.cpp',
'fpdfsdk/fsdk_annothandler.cpp',
- 'fpdfsdk/fsdk_baseannot.cpp',
'fpdfsdk/fsdk_baseform.cpp',
'fpdfsdk/fsdk_mgr.cpp',
'fpdfsdk/fsdk_pauseadapter.cpp',