From 2fd78b36e7e0bacc6ce7c9b4e4f1258de95f1ebe Mon Sep 17 00:00:00 2001 From: disarray2077 <86157825+disarray2077@users.noreply.github.com> Date: Fri, 7 Jan 2022 10:22:26 -0300 Subject: [PATCH] Improve open error for files from network --- BeefLibs/Beefy2D/src/utils/HTTP.bf | 9 +++++ IDE/src/ui/SourceViewPanel.bf | 56 ++++++++++++++++++++++-------- IDEHelper/DebugManager.cpp | 6 ++++ IDEHelper/NetManager.cpp | 19 +++++++++- IDEHelper/NetManager.h | 11 +++--- 5 files changed, 81 insertions(+), 20 deletions(-) diff --git a/BeefLibs/Beefy2D/src/utils/HTTP.bf b/BeefLibs/Beefy2D/src/utils/HTTP.bf index ed0dd848..a955e976 100644 --- a/BeefLibs/Beefy2D/src/utils/HTTP.bf +++ b/BeefLibs/Beefy2D/src/utils/HTTP.bf @@ -19,6 +19,9 @@ namespace Beefy2D.utils [CallingConvention(.Stdcall), CLink] static extern int32 HTTP_GetResult(void* netRequest, int32 waitMS); + [CallingConvention(.Stdcall), CLink] + static extern void HTTP_GetLastError(void* netRequest, out char8* error, out int32 errorLength); + [CallingConvention(.Stdcall), CLink] static extern void HTTP_Delete(void* netRequest); @@ -37,5 +40,11 @@ namespace Beefy2D.utils { return (HTTPResult)HTTP_GetResult(mNativeNetRequest, 0); } + + public void GetLastError(String outError) + { + HTTP_GetLastError(mNativeNetRequest, let error, let errorLength); + outError.Append(StringView(error, errorLength)); + } } } diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index 93bafebe..708f2ae3 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -3121,13 +3121,19 @@ namespace IDE.ui void FileOpenFailed() { + bool fileFromNetwork = mOldVerLoadCmd?.StartsWith("http", .OrdinalIgnoreCase) == true; + mLoadFailed = true; //mLastFileTextVersion = mEditWidget.Content.mData.mCurTextVersionId; mPanelHeader = new PanelHeader(); String fileName = scope String(); Path.GetFileName(mFilePath, fileName); String headerStr = scope String(); - headerStr.AppendF("Source file '{0}' is unavailable. Requested path is '{1}'", fileName, mFilePath); + headerStr.AppendF("Source file '{0}' is unavailable. ", fileName); + if (fileFromNetwork) + headerStr.Append("Failed to retrieve from network."); + else + headerStr.AppendF("Requested path is '{0}'", mFilePath); mPanelHeader.Label = headerStr; if (!sPreviousVersionWarningShown) { @@ -3162,19 +3168,30 @@ namespace IDE.ui }); } - var button = mPanelHeader.AddButton("Retry"); - button.mOnMouseClick.Add(new (evt) => - { - Reload(); - }); + if (fileFromNetwork) + { + var button = mPanelHeader.AddButton("Retry"); + button.mOnMouseClick.Add(new (evt) => + { + LoadOldVer(); + }); + } + else + { + var button = mPanelHeader.AddButton("Retry"); + button.mOnMouseClick.Add(new (evt) => + { + Reload(); + }); + + button = mPanelHeader.AddButton("Auto Find"); + button.mOnMouseClick.Add(new (evt) => + { + AutoFind(); + }); + } - button = mPanelHeader.AddButton("Auto Find"); - button.mOnMouseClick.Add(new (evt) => - { - AutoFind(); - }); - - button = mPanelHeader.AddButton("Browse..."); + var button = mPanelHeader.AddButton("Browse..."); button.mOnMouseClick.Add(new (evt) => { BrowseForFile(); @@ -5719,7 +5736,18 @@ namespace IDE.ui if (result != .NotDone) { if (result == .Failed) - gApp.OutputErrorLine("Failed to retrieve source from {}", mOldVerLoadCmd); + { + String errorMsg = scope .(); + errorMsg.AppendF("Failed to retrieve source from {}", mOldVerLoadCmd); + + String errorReason = scope .(); + mOldVerHTTPRequest.GetLastError(errorReason); + + if (!errorReason.IsEmpty) + errorMsg.AppendF(" ({})", errorReason); + + gApp.OutputErrorLine(errorMsg); + } CheckAdjustFile(); RetryLoad(); diff --git a/IDEHelper/DebugManager.cpp b/IDEHelper/DebugManager.cpp index 580959fb..992363da 100644 --- a/IDEHelper/DebugManager.cpp +++ b/IDEHelper/DebugManager.cpp @@ -1617,6 +1617,12 @@ BF_EXPORT int HTTP_GetResult(NetResult* netResult, int waitMS) } } +BF_EXPORT void HTTP_GetLastError(NetResult* netResult, const char** error, int* errorLength) +{ + *error = netResult->mError.GetPtr(); + *errorLength = netResult->mError.GetLength(); +} + BF_EXPORT void HTTP_Delete(NetResult* netResult) { if (!netResult->mDoneEvent->WaitFor(0)) diff --git a/IDEHelper/NetManager.cpp b/IDEHelper/NetManager.cpp index c198ea6d..47ac716d 100644 --- a/IDEHelper/NetManager.cpp +++ b/IDEHelper/NetManager.cpp @@ -165,7 +165,23 @@ void NetRequest::DoTransfer() curl_easy_getinfo(mCURL, CURLINFO_RESPONSE_CODE, &response_code); mNetManager->mDebugManager->OutputRawMessage(StrFormat("msgLo Result for '%s': %d\n", mURL.c_str(), response_code)); - if ((response_code == 0) || (response_code == 200) || (response_code == 404)) + if (response_code == 0) + { + mError.Clear(); + + int msgs_left = 0; + CURLMsg* msg = curl_multi_info_read(mCURLMulti, &msgs_left); + + if (msg != NULL && msg->msg == CURLMSG_DONE) + { + CURLcode return_code = msg->data.result; + mError.Append(curl_easy_strerror(return_code)); + } + + break; + } + + if ((response_code == 200) || (response_code == 404)) break; Cleanup(); @@ -410,6 +426,7 @@ NetRequest::~NetRequest() if (mResult != NULL) { mResult->mFailed = mFailed; + mResult->mError = mError; mResult->mCurRequest = NULL; if (mResult->mDoneEvent != NULL) { diff --git a/IDEHelper/NetManager.h b/IDEHelper/NetManager.h index 99c98993..0b7aa101 100644 --- a/IDEHelper/NetManager.h +++ b/IDEHelper/NetManager.h @@ -36,12 +36,12 @@ public: #else #endif volatile bool mCancelling; - bool mFailed; + bool mFailed; String mError; uint32 mLastUpdateTick; bool mShowTracking; - NetResult* mResult; - NetResult* mCancelOnSuccess; + NetResult* mResult; + NetResult* mCancelOnSuccess; NetRequest() { @@ -74,8 +74,9 @@ public: String mURL; String mOutPath; bool mFailed; - NetRequest* mCurRequest; - bool mRemoved; + String mError; + NetRequest* mCurRequest; + bool mRemoved; SyncEvent* mDoneEvent; NetResult()