Merge to XFA: Implement FPDFAction_GetFilePath().

The API is the same as the Foxit version, except the encoding is
specified as UTF-8 instead of local encoding.

Also remove CPDF_LWinParam since it's unused.

BUG=chromium:517713
R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1335373002 .

(cherry picked from commit 0b3c8f742613da294f812e2f6e908f4026499f96)
(cherry picked from commit a9d4bc541179ec0436adc4b2e18b7fdecc5952dc)
(cherry picked from commit 4ffd89ed556e32a6527d0e88952fe20ec1e2f362)

Review URL: https://codereview.chromium.org/1345953002 .
diff --git a/fpdfsdk/src/fpdfdoc.cpp b/fpdfsdk/src/fpdfdoc.cpp
index 47225dd..34caf95 100644
--- a/fpdfsdk/src/fpdfdoc.cpp
+++ b/fpdfsdk/src/fpdfdoc.cpp
@@ -128,7 +128,8 @@
 
 DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION pDict) {
   if (!pDict)
-    return 0;
+    return PDFACTION_UNSUPPORTED;
+
   CPDF_Action action((CPDF_Dictionary*)pDict);
   CPDF_Action::ActionType type = action.GetType();
   switch (type) {
@@ -143,43 +144,53 @@
     default:
       return PDFACTION_UNSUPPORTED;
   }
-  return PDFACTION_UNSUPPORTED;
 }
 
 DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document,
                                                FPDF_ACTION pDict) {
-  if (!document)
-    return NULL;
-  if (!pDict)
-    return NULL;
+  if (!document || !pDict)
+    return nullptr;
+
   CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
   CPDF_Action action((CPDF_Dictionary*)pDict);
   return action.GetDest(pDoc).GetObject();
 }
 
+DLLEXPORT unsigned long STDCALL
+FPDFAction_GetFilePath(FPDF_ACTION pDict, void* buffer, unsigned long buflen) {
+  unsigned long type = FPDFAction_GetType(pDict);
+  if (type != PDFACTION_REMOTEGOTO && type != PDFACTION_LAUNCH)
+    return 0;
+
+  CPDF_Action action((CPDF_Dictionary*)pDict);
+  CFX_ByteString path = action.GetFilePath().UTF8Encode();
+  unsigned long len = path.GetLength() + 1;
+  if (buffer && buflen >= len)
+    FXSYS_memcpy(buffer, path.c_str(), len);
+  return len;
+}
+
 DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document,
                                                       FPDF_ACTION pDict,
                                                       void* buffer,
                                                       unsigned long buflen) {
-  if (!document)
+  if (!document || !pDict)
     return 0;
-  if (!pDict)
-    return 0;
+
   CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
   CPDF_Action action((CPDF_Dictionary*)pDict);
   CFX_ByteString path = action.GetURI(pDoc);
   unsigned long len = path.GetLength() + 1;
-  if (buffer != NULL && buflen >= len)
+  if (buffer && buflen >= len)
     FXSYS_memcpy(buffer, path.c_str(), len);
   return len;
 }
 
 DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document,
                                                       FPDF_DEST pDict) {
-  if (!document)
+  if (!document || !pDict)
     return 0;
-  if (!pDict)
-    return 0;
+
   CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
   CPDF_Dest dest((CPDF_Array*)pDict);
   return dest.GetPageIndex(pDoc);
@@ -218,10 +229,9 @@
 
 DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document,
                                              FPDF_LINK pDict) {
-  if (!document)
-    return NULL;
-  if (!pDict)
-    return NULL;
+  if (!document || !pDict)
+    return nullptr;
+
   CPDF_Document* pDoc = ((CPDFXFA_Document*)document)->GetPDFDoc();
   CPDF_Link link((CPDF_Dictionary*)pDict);
   FPDF_DEST dest = link.GetDest(pDoc).GetObject();
@@ -230,13 +240,14 @@
   // If this link is not directly associated with a dest, we try to get action
   CPDF_Action action = link.GetAction();
   if (!action)
-    return NULL;
+    return nullptr;
   return action.GetDest(pDoc).GetObject();
 }
 
 DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK pDict) {
   if (!pDict)
-    return NULL;
+    return nullptr;
+
   CPDF_Link link((CPDF_Dictionary*)pDict);
   return link.GetAction().GetDict();
 }