Browse Source

Decoupling neon debugging from WebDAV

Source commit: a46fc7f1af4fe73d6c01e56e4e2571113f6d52f2
Martin Prikryl 8 years ago
parent
commit
a7883eda14

+ 1 - 1
source/core/Http.cpp

@@ -68,7 +68,7 @@ void THttp::SendRequest(const char * Method, const UnicodeString & Request)
     try
     {
       TProxyMethod ProxyMethod = ProxyHost.IsEmpty() ? ::pmNone : pmHTTP;
-      InitNeonSession(NeonSession, ProxyMethod, ProxyHost, ProxyPort, UnicodeString(), UnicodeString());
+      InitNeonSession(NeonSession, ProxyMethod, ProxyHost, ProxyPort, UnicodeString(), UnicodeString(), NULL);
 
       if (IsTls)
       {

+ 102 - 1
source/core/NeonIntf.cpp

@@ -7,13 +7,19 @@
 #include "CoreMain.h"
 #include "Exceptions.h"
 #include "Security.h"
+#include "Terminal.h"
 #include <TextsCore.h>
 #include <ne_auth.h>
+#define WINSCP
+extern "C"
+{
 #include <ne_redirect.h>
+}
 #include <StrUtils.hpp>
 //---------------------------------------------------------------------------
 #define SESSION_PROXY_AUTH_KEY "proxyauth"
 #define SESSION_TLS_INIT_KEY "tlsinit"
+#define SESSION_TERMINAL_KEY "terminal"
 //---------------------------------------------------------------------------
 void NeonParseUrl(const UnicodeString & Url, ne_uri & uri)
 {
@@ -69,7 +75,7 @@ ne_session * CreateNeonSession(const ne_uri & uri)
 }
 //---------------------------------------------------------------------------
 void InitNeonSession(ne_session * Session, TProxyMethod ProxyMethod, const UnicodeString & ProxyHost,
-  int ProxyPort, const UnicodeString & ProxyUsername, const UnicodeString & ProxyPassword)
+  int ProxyPort, const UnicodeString & ProxyUsername, const UnicodeString & ProxyPassword, TTerminal * Terminal)
 {
   if (ProxyMethod != ::pmNone)
   {
@@ -102,6 +108,11 @@ void InitNeonSession(ne_session * Session, TProxyMethod ProxyMethod, const Unico
 
   ne_redirect_register(Session);
   ne_set_useragent(Session, StrToNeon(FORMAT(L"%s/%s", (AppNameString(), Configuration->Version))));
+
+  if (Terminal != NULL)
+  {
+    ne_set_session_private(Session, SESSION_TERMINAL_KEY, Terminal);
+  }
 }
 //---------------------------------------------------------------------------
 void DestroyNeonSession(ne_session * Session)
@@ -303,3 +314,93 @@ UnicodeString NeonCertificateFailuresErrorStr(int Failures, const UnicodeString
   }
   return Result;
 }
+//---------------------------------------------------------------------------
+static std::unique_ptr<TCriticalSection> DebugSection(TraceInitPtr(new TCriticalSection));
+static std::set<TTerminal *> NeonTerminals;
+//---------------------------------------------------------------------------
+extern "C"
+{
+
+void ne_debug(void * Context, int Channel, const char * Format, ...)
+{
+  bool DoLog;
+
+  if (FLAGSET(Channel, NE_DBG_SOCKET) ||
+      FLAGSET(Channel, NE_DBG_HTTP) ||
+      FLAGSET(Channel, NE_DBG_HTTPAUTH) ||
+      FLAGSET(Channel, NE_DBG_SSL))
+  {
+    DoLog = true;
+  }
+  else if (FLAGSET(Channel, NE_DBG_XML) ||
+           FLAGSET(Channel, NE_DBG_WINSCP_HTTP_DETAIL))
+  {
+    DoLog = (Configuration->ActualLogProtocol >= 1);
+  }
+  else if (FLAGSET(Channel, NE_DBG_LOCKS) ||
+           FLAGSET(Channel, NE_DBG_XMLPARSE) ||
+           FLAGSET(Channel, NE_DBG_HTTPBODY))
+  {
+    DoLog = (Configuration->ActualLogProtocol >= 2);
+  }
+  else
+  {
+    DoLog = false;
+    DebugFail();
+  }
+
+  #ifndef _DEBUG
+  if (DoLog)
+  #endif
+  {
+    va_list Args;
+    va_start(Args, Format);
+    UTF8String UTFMessage;
+    UTFMessage.vprintf(Format, Args);
+    va_end(Args);
+
+    UnicodeString Message = TrimRight(UTFMessage);
+
+    if (DoLog)
+    {
+      // Note that this gets called for THttp sessions too.
+      // It does no harm atm.
+      TTerminal * Terminal = NULL;
+      if (Context != NULL)
+      {
+        ne_session * Session = static_cast<ne_session *>(Context);
+
+        Terminal =
+          static_cast<TTerminal *>(ne_get_session_private(Session, SESSION_TERMINAL_KEY));
+      }
+      else
+      {
+        TGuard Guard(DebugSection.get());
+
+        if (NeonTerminals.size() == 1)
+        {
+          Terminal = *NeonTerminals.begin();
+        }
+      }
+
+      if (Terminal != NULL)
+      {
+        Terminal->LogEvent(Message);
+      }
+    }
+  }
+}
+
+} // extern "C"
+//---------------------------------------------------------------------------
+void __fastcall RegisterForNeonDebug(TTerminal * Terminal)
+{
+  TGuard Guard(DebugSection.get());
+  NeonTerminals.insert(Terminal);
+}
+//---------------------------------------------------------------------------
+void __fastcall UnregisterFromNeonDebug(TTerminal * Terminal)
+{
+  TGuard Guard(DebugSection.get());
+  NeonTerminals.erase(Terminal);
+}

+ 3 - 1
source/core/NeonIntf.h

@@ -13,7 +13,7 @@ void NeonParseUrl(const UnicodeString & Url, ne_uri & uri);
 bool IsTlsUri(const ne_uri & uri);
 ne_session * CreateNeonSession(const ne_uri & uri);
 void InitNeonSession(ne_session * Session, TProxyMethod ProxyMethod, const UnicodeString & ProxyHost,
-  int ProxyPort, const UnicodeString & ProxyUsername, const UnicodeString & ProxyPassword);
+  int ProxyPort, const UnicodeString & ProxyUsername, const UnicodeString & ProxyPassword, TTerminal * Terminal);
 void DestroyNeonSession(ne_session * Session);
 UnicodeString GetNeonError(ne_session * Session);
 void CheckNeonStatus(ne_session * Session, int NeonStatus,
@@ -25,5 +25,7 @@ void SetNeonTlsInit(ne_session * Session, TNeonTlsInit OnNeonTlsInit);
 AnsiString NeonExportCertificate(const ne_ssl_certificate * Certificate);
 bool NeonWindowsValidateCertificate(int & Failures, const AnsiString & AsciiCert, UnicodeString & Error);
 UnicodeString NeonCertificateFailuresErrorStr(int Failures, const UnicodeString & HostName);
+void __fastcall RegisterForNeonDebug(TTerminal * Terminal);
+void __fastcall UnregisterFromNeonDebug(TTerminal * Terminal);
 //---------------------------------------------------------------------------
 #endif

+ 4 - 99
source/core/WebDAVFileSystem.cpp

@@ -81,84 +81,6 @@ static const int HttpUnauthorized = 401;
 #define PROP_EXECUTABLE "executable"
 #define PROP_OWNER "owner"
 #define PROP_DISPLAY_NAME "displayname"
-//---------------------------------------------------------------------------
-static std::unique_ptr<TCriticalSection> DebugSection(TraceInitPtr(new TCriticalSection));
-static std::set<TWebDAVFileSystem *> FileSystems;
-//---------------------------------------------------------------------------
-extern "C"
-{
-
-void ne_debug(void * Context, int Channel, const char * Format, ...)
-{
-  bool DoLog;
-
-  if (FLAGSET(Channel, NE_DBG_SOCKET) ||
-      FLAGSET(Channel, NE_DBG_HTTP) ||
-      FLAGSET(Channel, NE_DBG_HTTPAUTH) ||
-      FLAGSET(Channel, NE_DBG_SSL))
-  {
-    DoLog = true;
-  }
-  else if (FLAGSET(Channel, NE_DBG_XML) ||
-           FLAGSET(Channel, NE_DBG_WINSCP_HTTP_DETAIL))
-  {
-    DoLog = (Configuration->ActualLogProtocol >= 1);
-  }
-  else if (FLAGSET(Channel, NE_DBG_LOCKS) ||
-           FLAGSET(Channel, NE_DBG_XMLPARSE) ||
-           FLAGSET(Channel, NE_DBG_HTTPBODY))
-  {
-    DoLog = (Configuration->ActualLogProtocol >= 2);
-  }
-  else
-  {
-    DoLog = false;
-    DebugFail();
-  }
-
-  #ifndef _DEBUG
-  if (DoLog)
-  #endif
-  {
-    va_list Args;
-    va_start(Args, Format);
-    UTF8String UTFMessage;
-    UTFMessage.vprintf(Format, Args);
-    va_end(Args);
-
-    UnicodeString Message = TrimRight(UTFMessage);
-
-    if (DoLog)
-    {
-      // Note that this gets called for THttp sessions too.
-      // It does no harm atm.
-      TWebDAVFileSystem * FileSystem = NULL;
-      if (Context != NULL)
-      {
-        ne_session * Session = static_cast<ne_session *>(Context);
-
-        FileSystem =
-          static_cast<TWebDAVFileSystem *>(ne_get_session_private(Session, SESSION_FS_KEY));
-      }
-      else
-      {
-        TGuard Guard(DebugSection.get());
-
-        if (FileSystems.size() == 1)
-        {
-          FileSystem = *FileSystems.begin();
-        }
-      }
-
-      if (FileSystem != NULL)
-      {
-        FileSystem->NeonDebug(Message);
-      }
-    }
-  }
-}
-
-} // extern "C"
 //------------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 // ne_path_escape returns 7-bit string, so it does not really matter if we use
@@ -253,7 +175,7 @@ TWebDAVFileSystem::TWebDAVFileSystem(TTerminal * ATerminal) :
 //---------------------------------------------------------------------------
 __fastcall TWebDAVFileSystem::~TWebDAVFileSystem()
 {
-  UnregisterFromDebug();
+  UnregisterFromNeonDebug(FTerminal);
 
   {
     TGuard Guard(FNeonLockStoreSection);
@@ -280,7 +202,7 @@ void __fastcall TWebDAVFileSystem::Open()
     FTerminal->LogEvent(L"Warning: SSPI initialization failed.");
   }
 
-  RegisterForDebug();
+  RegisterForNeonDebug(FTerminal);
 
   FCurrentDirectory = L"";
   FHasTrailingSlash = true;
@@ -386,7 +308,7 @@ void __fastcall TWebDAVFileSystem::InitSession(ne_session_s * Session)
 
   InitNeonSession(
     Session, Data->ProxyMethod, Data->ProxyHost, Data->ProxyPort,
-    Data->ProxyUsername, Data->ProxyPassword);
+    Data->ProxyUsername, Data->ProxyPassword, FTerminal);
 
   ne_set_read_timeout(FNeonSession, Data->Timeout);
 
@@ -549,19 +471,7 @@ void __fastcall TWebDAVFileSystem::Close()
   CloseNeonSession();
   FTerminal->Closed();
   FActive = false;
-  UnregisterFromDebug();
-}
-//---------------------------------------------------------------------------
-void __fastcall TWebDAVFileSystem::RegisterForDebug()
-{
-  TGuard Guard(DebugSection.get());
-  FileSystems.insert(this);
-}
-//---------------------------------------------------------------------------
-void __fastcall TWebDAVFileSystem::UnregisterFromDebug()
-{
-  TGuard Guard(DebugSection.get());
-  FileSystems.erase(this);
+  UnregisterFromNeonDebug(FTerminal);
 }
 //---------------------------------------------------------------------------
 bool __fastcall TWebDAVFileSystem::GetActive()
@@ -2671,11 +2581,6 @@ void TWebDAVFileSystem::NeonNotifier(void * UserData, ne_session_status Status,
   }
 }
 //------------------------------------------------------------------------------
-void __fastcall TWebDAVFileSystem::NeonDebug(const UnicodeString & Message)
-{
-  FTerminal->LogEvent(Message);
-}
-//------------------------------------------------------------------------------
 void TWebDAVFileSystem::InitSslSession(ssl_st * Ssl, ne_session * Session)
 {
   TWebDAVFileSystem * FileSystem =

+ 0 - 4
source/core/WebDAVFileSystem.h

@@ -83,8 +83,6 @@ public:
   virtual void __fastcall UnlockFile(const UnicodeString & FileName, const TRemoteFile * File);
   virtual void __fastcall UpdateFromMain(TCustomFileSystem * MainFileSystem);
 
-  void __fastcall NeonDebug(const UnicodeString & Message);
-
 protected:
   virtual UnicodeString __fastcall GetCurrentDirectory();
 
@@ -185,8 +183,6 @@ private:
     TRemoteFile *& File, TRemoteFile * ALinkedByFile);
   int __fastcall CustomReadFileInternal(const UnicodeString FileName,
     TRemoteFile *& File, TRemoteFile * ALinkedByFile);
-  void __fastcall RegisterForDebug();
-  void __fastcall UnregisterFromDebug();
   bool VerifyCertificate(const TWebDAVCertificateData & Data, bool Aux);
   void OpenUrl(const UnicodeString & Url);
   void __fastcall CollectTLSSessionInfo();