diff --git a/include/fileteepee/ThrottleSocket.h b/include/fileteepee/ThrottleSocket.h --- a/include/fileteepee/ThrottleSocket.h +++ b/include/fileteepee/ThrottleSocket.h @@ -1,222 +1,222 @@ /* * ThrottleSocket.h * i.Ftp * * Created by Matthew Allen on 24/07/10. * Copyright 2010 Memecode. All rights reserved. * */ #ifndef _THROTTLE_SOCKET_H_ #define _THROTTLE_SOCKET_H_ #include "lgi/common/Log.h" #include "lgi/common/DocView.h" #include "resdefs.h" #include "lgi/common/LgiRes.h" /////////////////////////////////////////////////////////////////////////// #define FTP_COL_WRITE LColour(0,0,255) #define FTP_COL_READ LColour(0,128,0) #define FTP_COL_ERROR LColour(255,0,0) #define FTP_COL_INFO LColour(0,0,0) /////////////////////////////////////////////////////////////////////////// class ThrottleSource { public: virtual ~ThrottleSource() {} virtual int GetThrottle() = 0; virtual void OnDisconnect() = 0; }; template class ThrottleSocket : public T { public: enum Proto { Ftp, Http, Data }; protected: ThrottleSource *App; Proto Type; // Throttling uint64 Prev; int CurTransfer; // Logging LStringPipe p; Progress *Info; LLog *Logger; bool Logging; public: ThrottleSocket(ThrottleSource *app, LLog *log, Proto type) { App = app; Type = type; Prev = 0; CurTransfer = 0; Info = 0; Logger = log; Logging = Type != Data; } void OnDisconnect() { if (Type == Ftp) App->OnDisconnect(); } void WriteLog(const char *s, int Len, LColour c) { if (Logging && Logger && s && Len > 0) { if (Len > 5 && strnicmp(s, "PASS ", 5) == 0) { Logger->Write(c, "PASS *******", 12); return; } char *Eol; - while ((Len > 0) && (Eol = strnstr((char*)s, "\r\n", Len))) + while ((Len > 0) && (Eol = Strnstr(s, "\r\n", Len))) { int l = Eol-s; Logger->Write(c, s, l); s += l + 2; Len -= l + 2; } if (Len > 0) { Logger->Write(c, s, Len); } } } int Read(void *buf, int size, int flags) { int r = -1; int Throttle = App->GetThrottle(); if (Throttle) { uint64 Now = LCurrentTime(); if (Now - Prev < 1000) { int Remain = Throttle - CurTransfer; if (Remain < 1) Remain = 1; r = T::Read(buf, MIN(size, Remain), flags); #if 0 printf("r=%i size=%i Remain=%i Throttle=%i CurTransfer=%i Prev="LGI_PrintfInt64" Now="LGI_PrintfInt64"\n", r, size, Remain, Throttle, CurTransfer, Prev, Now); #endif if (r > 0) CurTransfer += r; if (CurTransfer >= Throttle) { int Ms = 1000 - (Now - Prev); LSleep(Ms); } } else { Prev = Now; r = T::Read(buf, MIN(size, Throttle), flags); if (r > 0) CurTransfer = r; } } else { r = T::Read(buf, size, flags); } return r; } void OnRead(char *Ptr, int Len) { if (Info) Info->Value(Info->Value() + Len); if (Logging) { p.Write(Ptr, Len); char s[512]; while (p.Pop(s, sizeof(s))) { if (Type == Http && s[0] == '\r') { Logging = false; } else if (Ptr) { bool Error = false; if (Type == Ftp) { Error = s[0] == '5' && IsDigit(s[1]) && IsDigit(s[2]) && s[3] == ' '; } WriteLog(s, strlen(s), Error ? FTP_COL_ERROR : FTP_COL_READ); } } } } void OnWrite(const char *Ptr, int Len) { if (Info) Info->Value(Info->Value() + Len); if (Ptr) WriteLog(Ptr, Len, FTP_COL_WRITE); } void OnInformation(const char *Str) { if (Logger) Logger->Print(FTP_COL_INFO, "%s: %s", LLoadString(IDS_INFORMATION), Str); } void OnError(int ErrorCode, const char *ErrorDescription) { if (Logger) { if (ErrorCode > 0) Logger->Print(FTP_COL_ERROR, "%s(%i): %s", LLoadString(IDS_ERROR), ErrorCode, ErrorDescription); else Logger->Print(FTP_COL_ERROR, "%s: %s", LLoadString(IDS_ERROR), ErrorDescription); } } LStreamI *Clone() { ThrottleSocket *n = new ThrottleSocket(App, Logger, Data); // printf("Clone = %p\n", n); if (n) { LSocks5Socket *nsock = dynamic_cast(n); if (nsock) nsock->SetProxy(dynamic_cast(this)); } return n; } }; #endif diff --git a/linux/Makefile.linux b/linux/Makefile.linux --- a/linux/Makefile.linux +++ b/linux/Makefile.linux @@ -1,403 +1,406 @@ #!/usr/bin/make # # This makefile generated by LgiIde # http://www.memecode.com/lgi.php # .SILENT : CC = gcc CPP = g++ Target = ./fileteepee ifndef Build Build = Debug endif +MakeDir := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) BuildDir = $(Build) -Flags = -fPIC -w -fno-inline -fpermissive +Flags = -fPIC -fno-inline -fpermissive -Wno-format-truncation ifeq ($(Build),Debug) - Flags += -g -std=c++14 + Flags += -MMD -MP -g -std=c++14 Tag = d Defs = -D_DEBUG -DLINUX -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DPOSIX Libs = \ -lmagic \ -static-libgcc \ `pkg-config --libs gtk+-3.0` \ -llgi-gtk3$(Tag) \ -L../../lgi/trunk/$(BuildDir) Inc = \ `pkg-config --cflags gtk+-3.0` \ - -I/usr/include/gstreamer-1.0 \ + -I../../../../../usr/include/gstreamer-1.0 \ -I../resources \ -I../include/fileteepee \ -I../../lgi/trunk/include/lgi/linux/Gtk \ -I../../lgi/trunk/include/lgi/linux \ -I../../lgi/trunk/include \ -I../../../codelib/openssl/include else - Flags += -s -Os -std=c++14 + Flags += -MMD -MP -s -Os -std=c++14 Defs = -DLINUX -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DPOSIX Libs = \ -lmagic \ -static-libgcc \ `pkg-config --libs gtk+-3.0` \ -llgi-gtk3$(Tag) \ -L../../lgi/trunk/$(BuildDir) Inc = \ `pkg-config --cflags gtk+-3.0` \ - -I/usr/include/gstreamer-1.0 \ + -I../../../../../usr/include/gstreamer-1.0 \ -I../resources \ -I../include/fileteepee \ -I../../lgi/trunk/include/lgi/linux/Gtk \ -I../../lgi/trunk/include/lgi/linux \ -I../../lgi/trunk/include \ -I../../../codelib/openssl/include endif # Dependencies Source = ../src/Schedule.cpp \ ../src/ResumeDlg.cpp \ ../src/RemoteFS.cpp \ ../src/PermsDlg.cpp \ ../src/LogPanel.cpp \ ../src/LocalFS.cpp \ ../src/ISFtp.cpp \ ../src/HttpDlg.cpp \ ../src/FtpWorkerThread.cpp \ ../src/FtpApp.cpp \ ../src/FileSystemView.cpp \ ../src/DirListItem.cpp \ ../src/ConnectDlg.cpp \ ../../lgi/trunk/src/common/Widgets/ControlTree.cpp \ ../../lgi/trunk/src/common/Text/XmlTreeUi.cpp \ ../../lgi/trunk/src/common/Net/OpenSSLSocket.cpp \ ../../lgi/trunk/src/common/Net/Http.cpp \ ../../lgi/trunk/src/common/Net/Ftp.cpp \ ../../lgi/trunk/src/common/Net/FileTransferProgress.cpp \ ../../lgi/trunk/src/common/Lgi/ProgressStatusPane.cpp \ ../../lgi/trunk/src/common/Lgi/LgiMain.cpp \ ../../lgi/trunk/src/common/Lgi/About.cpp \ ../../lgi/trunk/src/common/Gdc2/Filters/Png.cpp \ ../../lgi/trunk/src/common/Gdc2/Filters/Lzw.cpp \ ../../lgi/trunk/src/common/Gdc2/Filters/Gif.cpp \ ../../lgi/trunk/src/common/Db/Db-Csv.cpp -SourceLst := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(Source))) +SourceC := $(filter %.c,$(Source)) +ObjectsC := $(SourceC:.c=.o) +SourceCpp := $(filter %.cpp,$(Source)) +ObjectsCpp := $(SourceCpp:.cpp=.o) +Objects := $(notdir $(ObjectsC) $(ObjectsCpp)) +Objects := $(addprefix $(BuildDir)/,$(Objects)) +Deps := $(patsubst %.o,%.d,$(Objects)) -Objects := $(addprefix $(BuildDir)/,$(SourceLst)) +$(BuildDir)/%.o: %.c + mkdir -p $(@D) + echo $(notdir $<) [$(Build)] + $(CC) $(Inc) $(Flags) $(Defs) -c $< -o $@ + +$(BuildDir)/%.o: %.cpp + mkdir -p $(@D) + echo $(notdir $<) [$(Build)] + $(CPP) $(Inc) $(Flags) $(Defs) -c $< -o $@ # Target # Executable target $(Target) : ../../lgi/trunk/$(BuildDir)/liblgi-gtk3$(Tag).so $(Objects) mkdir -p $(BuildDir) @echo Linking $(Target) [$(Build)]... $(CPP) -Wl,-export-dynamic,-R. -o \ $(Target) $(Objects) $(Libs) @echo Done. ../../lgi/trunk/$(BuildDir)/liblgi-gtk3$(Tag).so : ../../lgi/trunk/include/lgi/common/App.h \ ../../lgi/trunk/include/lgi/common/Array.h \ ../../lgi/trunk/include/lgi/common/AutoPtr.h \ ../../lgi/trunk/include/lgi/common/Base64.h \ ../../lgi/trunk/include/lgi/common/Bitmap.h \ ../../lgi/trunk/include/lgi/common/Box.h \ ../../lgi/trunk/include/lgi/common/Button.h \ ../../lgi/trunk/include/lgi/common/CairoSurface.h \ ../../lgi/trunk/include/lgi/common/Cancel.h \ ../../lgi/trunk/include/lgi/common/Capabilities.h \ ../../lgi/trunk/include/lgi/common/Charset.h \ ../../lgi/trunk/include/lgi/common/CheckBox.h \ ../../lgi/trunk/include/lgi/common/ClipBoard.h \ ../../lgi/trunk/include/lgi/common/Colour.h \ ../../lgi/trunk/include/lgi/common/ColourSpace.h \ ../../lgi/trunk/include/lgi/common/Com.h \ ../../lgi/trunk/include/lgi/common/Combo.h \ ../../lgi/trunk/include/lgi/common/Containers.h \ ../../lgi/trunk/include/lgi/common/Core.h \ ../../lgi/trunk/include/lgi/common/Css.h \ ../../lgi/trunk/include/lgi/common/CssTools.h \ ../../lgi/trunk/include/lgi/common/CurrentTime.h \ ../../lgi/trunk/include/lgi/common/DataDlg.h \ ../../lgi/trunk/include/lgi/common/DateTime.h \ ../../lgi/trunk/include/lgi/common/Dialog.h \ ../../lgi/trunk/include/lgi/common/DisplayString.h \ ../../lgi/trunk/include/lgi/common/DocView.h \ ../../lgi/trunk/include/lgi/common/Dom.h \ ../../lgi/trunk/include/lgi/common/DomFields.h \ ../../lgi/trunk/include/lgi/common/DragAndDrop.h \ ../../lgi/trunk/include/lgi/common/DropFiles.h \ ../../lgi/trunk/include/lgi/common/Edit.h \ + ../../lgi/trunk/include/lgi/common/Emoji.h \ ../../lgi/trunk/include/lgi/common/Error.h \ ../../lgi/trunk/include/lgi/common/EventTargetThread.h \ ../../lgi/trunk/include/lgi/common/File.h \ ../../lgi/trunk/include/lgi/common/FileSelect.h \ ../../lgi/trunk/include/lgi/common/Filter.h \ ../../lgi/trunk/include/lgi/common/FindReplaceDlg.h \ ../../lgi/trunk/include/lgi/common/Font.h \ ../../lgi/trunk/include/lgi/common/FontCache.h \ ../../lgi/trunk/include/lgi/common/FontSelect.h \ ../../lgi/trunk/include/lgi/common/Gdc2.h \ ../../lgi/trunk/include/lgi/common/GdcTools.h \ ../../lgi/trunk/include/lgi/common/GdiLeak.h \ ../../lgi/trunk/include/lgi/common/HashTable.h \ ../../lgi/trunk/include/lgi/common/ImageList.h \ ../../lgi/trunk/include/lgi/common/Input.h \ ../../lgi/trunk/include/lgi/common/ItemContainer.h \ ../../lgi/trunk/include/lgi/common/Json.h \ ../../lgi/trunk/include/lgi/common/Layout.h \ ../../lgi/trunk/include/lgi/common/Lgi.h \ ../../lgi/trunk/include/lgi/common/LgiClasses.h \ ../../lgi/trunk/include/lgi/common/LgiCommon.h \ ../../lgi/trunk/include/lgi/common/LgiDefs.h \ ../../lgi/trunk/include/lgi/common/LgiInc.h \ ../../lgi/trunk/include/lgi/common/LgiInterfaces.h \ ../../lgi/trunk/include/lgi/common/LgiMsgs.h \ - ../../lgi/trunk/include/lgi/common/LgiNetInc.h \ ../../lgi/trunk/include/lgi/common/LgiRes.h \ ../../lgi/trunk/include/lgi/common/LgiString.h \ ../../lgi/trunk/include/lgi/common/LgiUiBase.h \ ../../lgi/trunk/include/lgi/common/Library.h \ ../../lgi/trunk/include/lgi/common/LibraryUtils.h \ ../../lgi/trunk/include/lgi/common/List.h \ ../../lgi/trunk/include/lgi/common/ListItemCheckBox.h \ ../../lgi/trunk/include/lgi/common/ListItemRadioBtn.h \ ../../lgi/trunk/include/lgi/common/LMallocArray.h \ ../../lgi/trunk/include/lgi/common/Mail.h \ ../../lgi/trunk/include/lgi/common/Matrix.h \ ../../lgi/trunk/include/lgi/common/Mem.h \ ../../lgi/trunk/include/lgi/common/Menu.h \ ../../lgi/trunk/include/lgi/common/Message.h \ ../../lgi/trunk/include/lgi/common/Mime.h \ ../../lgi/trunk/include/lgi/common/Mru.h \ ../../lgi/trunk/include/lgi/common/Mutex.h \ ../../lgi/trunk/include/lgi/common/Net.h \ - ../../lgi/trunk/include/lgi/common/NetTools.h \ ../../lgi/trunk/include/lgi/common/Notifications.h \ ../../lgi/trunk/include/lgi/common/OAuth2.h \ ../../lgi/trunk/include/lgi/common/OptionsFile.h \ ../../lgi/trunk/include/lgi/common/Palette.h \ ../../lgi/trunk/include/lgi/common/Panel.h \ ../../lgi/trunk/include/lgi/common/Password.h \ ../../lgi/trunk/include/lgi/common/Path.h \ ../../lgi/trunk/include/lgi/common/PixelRops.h \ ../../lgi/trunk/include/lgi/common/Point.h \ ../../lgi/trunk/include/lgi/common/Popup.h \ ../../lgi/trunk/include/lgi/common/PopupList.h \ + ../../lgi/trunk/include/lgi/common/PopupNotification.h \ ../../lgi/trunk/include/lgi/common/Printer.h \ ../../lgi/trunk/include/lgi/common/Profile.h \ ../../lgi/trunk/include/lgi/common/Progress.h \ ../../lgi/trunk/include/lgi/common/ProgressDlg.h \ ../../lgi/trunk/include/lgi/common/ProgressView.h \ ../../lgi/trunk/include/lgi/common/Properties.h \ ../../lgi/trunk/include/lgi/common/RadioGroup.h \ ../../lgi/trunk/include/lgi/common/Range.h \ ../../lgi/trunk/include/lgi/common/Rect.h \ ../../lgi/trunk/include/lgi/common/RectF.h \ ../../lgi/trunk/include/lgi/common/RefCount.h \ ../../lgi/trunk/include/lgi/common/RegKey.h \ ../../lgi/trunk/include/lgi/common/Res.h \ ../../lgi/trunk/include/lgi/common/Rops.h \ ../../lgi/trunk/include/lgi/common/ScrollBar.h \ ../../lgi/trunk/include/lgi/common/SkinEngine.h \ ../../lgi/trunk/include/lgi/common/Slider.h \ ../../lgi/trunk/include/lgi/common/Splitter.h \ ../../lgi/trunk/include/lgi/common/StatusBar.h \ ../../lgi/trunk/include/lgi/common/Store3Defs.h \ ../../lgi/trunk/include/lgi/common/Stream.h \ ../../lgi/trunk/include/lgi/common/StringClass.h \ ../../lgi/trunk/include/lgi/common/StringLayout.h \ ../../lgi/trunk/include/lgi/common/StructuredIo.h \ ../../lgi/trunk/include/lgi/common/StructuredLog.h \ ../../lgi/trunk/include/lgi/common/SubProcess.h \ ../../lgi/trunk/include/lgi/common/TableLayout.h \ ../../lgi/trunk/include/lgi/common/TabView.h \ ../../lgi/trunk/include/lgi/common/TextFile.h \ ../../lgi/trunk/include/lgi/common/TextLabel.h \ ../../lgi/trunk/include/lgi/common/TextLog.h \ ../../lgi/trunk/include/lgi/common/TextView3.h \ ../../lgi/trunk/include/lgi/common/Thread.h \ ../../lgi/trunk/include/lgi/common/ThreadEvent.h \ ../../lgi/trunk/include/lgi/common/Token.h \ ../../lgi/trunk/include/lgi/common/ToolBar.h \ ../../lgi/trunk/include/lgi/common/ToolTip.h \ ../../lgi/trunk/include/lgi/common/TrayIcon.h \ ../../lgi/trunk/include/lgi/common/Tree.h \ ../../lgi/trunk/include/lgi/common/Undo.h \ ../../lgi/trunk/include/lgi/common/Unicode.h \ ../../lgi/trunk/include/lgi/common/UnicodeString.h \ ../../lgi/trunk/include/lgi/common/UnrolledList.h \ + ../../lgi/trunk/include/lgi/common/Uri.h \ ../../lgi/trunk/include/lgi/common/Variant.h \ ../../lgi/trunk/include/lgi/common/View.h \ ../../lgi/trunk/include/lgi/common/Widgets.h \ ../../lgi/trunk/include/lgi/common/Window.h \ ../../lgi/trunk/include/lgi/common/XmlTree.h \ ../../lgi/trunk/include/lgi/linux/Gtk/LgiOsClasses.h \ ../../lgi/trunk/include/lgi/linux/Gtk/LgiOsDefs.h \ ../../lgi/trunk/include/lgi/linux/Gtk/LgiWidget.h \ ../../lgi/trunk/include/lgi/linux/Gtk/LgiWinManGlue.h \ ../../lgi/trunk/include/lgi/linux/SymLookup.h \ ../../lgi/trunk/include/lgi/mac/cocoa/LCocoaView.h \ ../../lgi/trunk/include/lgi/mac/cocoa/LgiMac.h \ ../../lgi/trunk/include/lgi/mac/cocoa/LgiOs.h \ ../../lgi/trunk/include/lgi/mac/cocoa/LgiOsClasses.h \ ../../lgi/trunk/include/lgi/mac/cocoa/LgiOsDefs.h \ ../../lgi/trunk/include/lgi/mac/cocoa/ObjCWrapper.h \ ../../lgi/trunk/include/lgi/mac/cocoa/SymLookup.h \ ../../lgi/trunk/private/common/FontPriv.h \ ../../lgi/trunk/private/common/ViewPriv.h \ ../../lgi/trunk/private/linux/AppPriv.h \ ../../lgi/trunk/src/common/Gdc2/15Bit.cpp \ ../../lgi/trunk/src/common/Gdc2/16Bit.cpp \ ../../lgi/trunk/src/common/Gdc2/24Bit.cpp \ ../../lgi/trunk/src/common/Gdc2/32Bit.cpp \ ../../lgi/trunk/src/common/Gdc2/8Bit.cpp \ ../../lgi/trunk/src/common/Gdc2/Alpha.cpp \ ../../lgi/trunk/src/common/Gdc2/Colour.cpp \ ../../lgi/trunk/src/common/Gdc2/Filters/Filter.cpp \ ../../lgi/trunk/src/common/Gdc2/Font/Charset.cpp \ ../../lgi/trunk/src/common/Gdc2/Font/DisplayString.cpp \ ../../lgi/trunk/src/common/Gdc2/Font/Font.cpp \ ../../lgi/trunk/src/common/Gdc2/Font/FontSystem.cpp \ ../../lgi/trunk/src/common/Gdc2/Font/FontType.cpp \ ../../lgi/trunk/src/common/Gdc2/Font/StringLayout.cpp \ ../../lgi/trunk/src/common/Gdc2/Font/TypeFace.cpp \ ../../lgi/trunk/src/common/Gdc2/GdcCommon.cpp \ ../../lgi/trunk/src/common/Gdc2/Path/Path.cpp \ ../../lgi/trunk/src/common/Gdc2/Rect.cpp \ ../../lgi/trunk/src/common/Gdc2/RopsCases.cpp \ ../../lgi/trunk/src/common/Gdc2/Surface.cpp \ ../../lgi/trunk/src/common/Gdc2/Tools/ColourReduce.cpp \ ../../lgi/trunk/src/common/Gdc2/Tools/GdcTools.cpp \ ../../lgi/trunk/src/common/General/Containers.cpp \ ../../lgi/trunk/src/common/General/DateTime.cpp \ ../../lgi/trunk/src/common/General/ExeCheck.cpp \ ../../lgi/trunk/src/common/General/FileCommon.cpp \ ../../lgi/trunk/src/common/General/Password.cpp \ ../../lgi/trunk/src/common/General/Properties.cpp \ ../../lgi/trunk/src/common/Hash/md5/md5.c \ ../../lgi/trunk/src/common/Hash/md5/md5.h \ ../../lgi/trunk/src/common/Hash/sha1/sha1.c \ ../../lgi/trunk/src/common/Hash/sha1/sha1.h \ ../../lgi/trunk/src/common/Lgi/Alert.cpp \ ../../lgi/trunk/src/common/Lgi/AppCommon.cpp \ ../../lgi/trunk/src/common/Lgi/Css.cpp \ ../../lgi/trunk/src/common/Lgi/CssTools.cpp \ ../../lgi/trunk/src/common/Lgi/DataDlg.cpp \ ../../lgi/trunk/src/common/Lgi/DragAndDropCommon.cpp \ ../../lgi/trunk/src/common/Lgi/FileSelect.cpp \ ../../lgi/trunk/src/common/Lgi/FindReplace.cpp \ ../../lgi/trunk/src/common/Lgi/FontSelect.cpp \ ../../lgi/trunk/src/common/Lgi/GuiUtils.cpp \ ../../lgi/trunk/src/common/Lgi/Input.cpp \ ../../lgi/trunk/src/common/Lgi/LgiCommon.cpp \ ../../lgi/trunk/src/common/Lgi/Library.cpp \ ../../lgi/trunk/src/common/Lgi/LMsg.cpp \ ../../lgi/trunk/src/common/Lgi/MemStream.cpp \ ../../lgi/trunk/src/common/Lgi/MenuCommon.cpp \ ../../lgi/trunk/src/common/Lgi/Mru.cpp \ ../../lgi/trunk/src/common/Lgi/Mutex.cpp \ ../../lgi/trunk/src/common/Lgi/Object.cpp \ ../../lgi/trunk/src/common/Lgi/OptionsFile.cpp \ ../../lgi/trunk/src/common/Lgi/Rand.cpp \ ../../lgi/trunk/src/common/Lgi/Stream.cpp \ ../../lgi/trunk/src/common/Lgi/SubProcess.cpp \ ../../lgi/trunk/src/common/Lgi/ThreadCommon.cpp \ ../../lgi/trunk/src/common/Lgi/ThreadEvent.cpp \ ../../lgi/trunk/src/common/Lgi/ToolTip.cpp \ ../../lgi/trunk/src/common/Lgi/TrayIcon.cpp \ ../../lgi/trunk/src/common/Lgi/Variant.cpp \ ../../lgi/trunk/src/common/Lgi/ViewCommon.cpp \ ../../lgi/trunk/src/common/Lgi/WindowCommon.cpp \ ../../lgi/trunk/src/common/Net/Base64.cpp \ ../../lgi/trunk/src/common/Net/MDStringToDigest.cpp \ ../../lgi/trunk/src/common/Net/Net.cpp \ - ../../lgi/trunk/src/common/Net/NetTools.cpp \ ../../lgi/trunk/src/common/Net/Uri.cpp \ ../../lgi/trunk/src/common/Resource/LgiRes.cpp \ ../../lgi/trunk/src/common/Resource/Res.cpp \ ../../lgi/trunk/src/common/Skins/Gel/Gel.cpp \ ../../lgi/trunk/src/common/Text/DocView.cpp \ ../../lgi/trunk/src/common/Text/String.cpp \ ../../lgi/trunk/src/common/Text/TextView3.cpp \ ../../lgi/trunk/src/common/Text/Token.cpp \ ../../lgi/trunk/src/common/Text/Unicode.cpp \ ../../lgi/trunk/src/common/Text/Utf8.cpp \ ../../lgi/trunk/src/common/Text/XmlTree.cpp \ ../../lgi/trunk/src/common/Widgets/Bitmap.cpp \ ../../lgi/trunk/src/common/Widgets/Box.cpp \ ../../lgi/trunk/src/common/Widgets/Button.cpp \ ../../lgi/trunk/src/common/Widgets/CheckBox.cpp \ ../../lgi/trunk/src/common/Widgets/Combo.cpp \ ../../lgi/trunk/src/common/Widgets/Edit.cpp \ ../../lgi/trunk/src/common/Widgets/ItemContainer.cpp \ ../../lgi/trunk/src/common/Widgets/List.cpp \ ../../lgi/trunk/src/common/Widgets/Panel.cpp \ ../../lgi/trunk/src/common/Widgets/Popup.cpp \ ../../lgi/trunk/src/common/Widgets/Progress.cpp \ ../../lgi/trunk/src/common/Widgets/ProgressDlg.cpp \ ../../lgi/trunk/src/common/Widgets/RadioGroup.cpp \ ../../lgi/trunk/src/common/Widgets/ScrollBar.cpp \ ../../lgi/trunk/src/common/Widgets/Slider.cpp \ ../../lgi/trunk/src/common/Widgets/Splitter.cpp \ ../../lgi/trunk/src/common/Widgets/StatusBar.cpp \ ../../lgi/trunk/src/common/Widgets/TableLayout.cpp \ ../../lgi/trunk/src/common/Widgets/TabView.cpp \ ../../lgi/trunk/src/common/Widgets/TextLabel.cpp \ ../../lgi/trunk/src/common/Widgets/ToolBar.cpp \ ../../lgi/trunk/src/common/Widgets/Tree.cpp \ ../../lgi/trunk/src/linux/General/File.cpp \ ../../lgi/trunk/src/linux/General/Mem.cpp \ ../../lgi/trunk/src/linux/General/ShowFileProp_Linux.cpp \ ../../lgi/trunk/src/linux/Gtk/Gdc2.cpp \ ../../lgi/trunk/src/linux/Gtk/LgiWidget.cpp \ ../../lgi/trunk/src/linux/Gtk/MemDC.cpp \ ../../lgi/trunk/src/linux/Gtk/PrintDC.cpp \ ../../lgi/trunk/src/linux/Gtk/ScreenDC.cpp \ ../../lgi/trunk/src/linux/Lgi/App.cpp \ ../../lgi/trunk/src/linux/Lgi/ClipBoard.cpp \ ../../lgi/trunk/src/linux/Lgi/DragAndDrop.cpp \ ../../lgi/trunk/src/linux/Lgi/General.cpp \ ../../lgi/trunk/src/linux/Lgi/Layout.cpp \ ../../lgi/trunk/src/linux/Lgi/Menu.cpp \ ../../lgi/trunk/src/linux/Lgi/Printer.cpp \ ../../lgi/trunk/src/linux/Lgi/Thread.cpp \ ../../lgi/trunk/src/linux/Lgi/View.cpp \ ../../lgi/trunk/src/linux/Lgi/Widgets.cpp \ ../../lgi/trunk/src/linux/Lgi/Window.cpp export Build=$(Build); \ - $(MAKE) -C ../../lgi/trunk -f Makefile.linux - -.SECONDEXPANSION: -$(Objects): $(BuildDir)/%.o: $$(wildcard %.c*) - mkdir -p $(@D) - @echo $(GetOptions()->GetValue(OPT_HttpProxyOn, v)) { SetCtrlValue(IDC_USE_PROXY, v.CastInt32()); } if (Parent->GetOptions()->GetValue(OPT_HttpProxy, v)) { SetCtrlName(IDC_PROXY_SERVER, v.Str()); } if (Parent->GetOptions()->GetValue(OPT_HttpProxyUser, v)) { SetCtrlName(IDC_USER_NAME, v.Str()); } if (Parent->GetOptions()->GetValue(OPT_HttpProxyPass, v)) { SetCtrlName(IDC_PASSWORD, v.Str()); } if (Parent->GetOptions()->GetValue(OPT_HttpUrl, v)) { SetCtrlName(IDC_URL, v.Str()); } if (Parent->GetOptions()->GetValue(OPT_HttpFile, v)) { SetCtrlName(IDC_FILE, v.Str()); SetResumable(LFileExists(v.Str())); } OnNotify(FindControl(IDC_USE_PROXY), LNotifyValueChanged); } } HttpDlg::~HttpDlg() { } void HttpDlg::OnCreate() { /* if (strlen(GetCtrlName(IDC_URL)) > 7) { PostEvent(WM_CHANGE, (int)FindControl(IDC_BROWSE), 0); } */ } void HttpDlg::SetRollback(bool r) { SetCtrlEnabled(IDC_ROLLBACK, r); bool Rolling = GetCtrlValue(IDC_ROLLBACK) != 0; SetCtrlEnabled(IDC_ROLLBACK_K, r && Rolling); SetCtrlEnabled(IDC_ROLLBACK_STATIC, r && Rolling); } void HttpDlg::SetResumable(bool r) { if (!r) SetCtrlValue(IDC_RESUME, 0); SetCtrlEnabled(IDC_RESUME_OPT, r); SetRollback(GetCtrlValue(IDC_RESUME) == 1); } int HttpDlg::OnNotify(LViewI *Ctrl, LNotification n) { if (!Ctrl) return 0; switch (Ctrl->GetId()) { case IDC_ROLLBACK: { SetCtrlEnabled(IDC_ROLLBACK_K, Ctrl->Value() != 0); SetCtrlEnabled(IDC_ROLLBACK_STATIC, Ctrl->Value() != 0); break; } case IDC_USE_PROXY: { auto e = GetCtrlValue(IDC_USE_PROXY) != 0; SetCtrlEnabled(IDC_PROXY_SERVER, e); SetCtrlEnabled(IDC_USER_NAME, e); SetCtrlEnabled(IDC_PASSWORD, e); break; } case IDC_RESUME: { SetRollback(GetCtrlValue(IDC_RESUME) == 1); break; } case IDC_BROWSE: { auto Select = new LFileSelect; Select->Parent(this); Select->Type("All Files", LGI_ALL_FILES); LUri u(GetCtrlName(IDC_URL)); if (u.sPath) { char *Dir = strrchr(u.sPath, '/'); char *File = Dir ? Dir + 1 : u.sPath.Get(); char *End = strchr(File, '?'); LString FileName; if (End) FileName.Set(File, End-File); else FileName = File; if (FileName) Select->Name(FileName); } Select->Save([this](auto Select, auto Status) { if (Status) { SetCtrlName(IDC_FILE, Select->Name()); SetResumable(LFileExists(Select->Name())); } delete Select; }); break; } case IDOK: { Url = GetCtrlName(IDC_URL); File = GetCtrlName(IDC_FILE); if (GetCtrlValue(IDC_USE_PROXY)) { Proxy = GetCtrlName(IDC_PROXY_SERVER); UserName = GetCtrlName(IDC_USER_NAME); Password = GetCtrlName(IDC_PASSWORD); } if (GetCtrlValue(IDC_RESUME) == 1) { StartFromByte = LFileSize(File); if (GetCtrlValue(IDC_ROLLBACK)) { auto Rollback = GetCtrlValue(IDC_ROLLBACK_K) << 10; if (Rollback > 0) { StartFromByte = MAX(0, StartFromByte - Rollback); } } } NoCache = GetCtrlValue(IDC_NO_CACHE) != 0; // fall thru } case IDCANCEL: { LVariant v; Parent->GetOptions()->SetValue(OPT_HttpUrl, v = GetCtrlName(IDC_URL)); Parent->GetOptions()->SetValue(OPT_HttpFile, v = GetCtrlName(IDC_FILE)); Parent->GetOptions()->SetValue(OPT_HttpProxyOn, v = GetCtrlValue(IDC_USE_PROXY)); Parent->GetOptions()->SetValue(OPT_HttpProxy, v = GetCtrlName(IDC_PROXY_SERVER)); Parent->GetOptions()->SetValue(OPT_HttpProxyUser, v = GetCtrlName(IDC_USER_NAME)); Parent->GetOptions()->SetValue(OPT_HttpProxyPass, v = GetCtrlName(IDC_PASSWORD)); EndModal(Ctrl->GetId()); break; } } return 0; } ////////////////////////////////////////////////////////////// class HttpSocket : public LSocket { LStreamI *Log; LStringPipe Read, Write; bool Hide; ssize_t DataRead; public: HttpSocket(LStreamI *log) { Log = log; Hide = false; DataRead = 0; } void OnRead(char *Data, ssize_t Len) { if (Hide) { DataRead += Len; return; } Read.Write(Data, Len); LString s; while ((s = Read.Pop()) && !Hide) { LString Ln; s = s.Strip(); if (s) Ln.Printf("< %s\n", s.Get()); else { Hide = true; DataRead += Read.GetSize(); break; } Log->Write(Ln.Get(), Ln.Length()); } } void OnWrite(const char *Data, ssize_t Len) { Write.Write(Data, Len); LString s; while ((s = Write.Pop())) { LString Ln; s = s.Strip(); if (s) Ln.Printf("> %s\n", s.Get()); else Ln = ">\n"; Log->Write(Ln.Get(), Ln.Length()); } } }; HttpThread::HttpThread(AppWnd *parent, HttpDlg *dlg, LStreamI *log) : LThread("HttpThread") { Parent = parent; DeleteOnExit = true; Dlg = dlg; Log = log; Run(); } HttpThread::~HttpThread() { } int HttpThread::Main() { if (Parent) { // reset progress if (Parent->Progress) { Parent->Progress->Cancel(false); } if (Dlg && Dlg->Url && Dlg->File) { ReopenHttp: // Parse URL LUri Uri(Dlg->Url); DoConnect: LHttp Http; // LAutoPtr Connection(new ThrottleSocket(Parent, Parent->LogPanel, ThrottleSocket::Http)); LAutoPtr Connection(new HttpSocket(Log)); bool OpenOk = false; Http.SetNoCache(Dlg->NoCache); if (Dlg->Proxy) { char *Col = strchr(Dlg->Proxy, ':'); if (Col) { *Col++ = 0; Http.SetProxy(Dlg->Proxy, atoi(Col)); Col[-1] = ':'; } else { Http.SetProxy(Dlg->Proxy, 80); } } OpenOk = Http.Open(Connection, Uri.sHost, Uri.Port); if (OpenOk) { Http.Meter = Parent->Progress; IFtpEntry e; e.Name = Dlg->File; Parent->CmdConnect.Enabled(false); Parent->CmdHttp.Enabled(false); Parent->CmdAbort.Enabled(true); if (!Uri.sProtocol) Uri.sProtocol = "http"; auto GetStr = Uri.ToString(); LFile Out; if (Out.Open(Dlg->File, O_WRITE)) { if (Dlg->StartFromByte > 0) { Http.SetResume(Dlg->StartFromByte); Out.SetSize(Dlg->StartFromByte); Out.Seek(Dlg->StartFromByte, SEEK_SET); } else { Out.SetSize(0); } int ProtocolStatus = 0; LHttp::ContentEncoding Enc; LStringPipe OutHeaders; bool Status = Http.Get(GetStr, NULL, &ProtocolStatus, &Out, &Enc, &OutHeaders); LAutoString ResponseHdrs(OutHeaders.NewStr()); LAutoString sLen(InetGetHeaderField(ResponseHdrs, "Content-Length")); int64 ContentLen = sLen ? atoi64(sLen) : -1; if (ProtocolStatus == 301 || ProtocolStatus == 302) { Dlg->Url = Http.AlternateLocation(); if (ValidStr(Dlg->Url)) { goto ReopenHttp; } else { Status = false; } } if (Status) { Http.GetSocket()->OnInformation("HTTP download successful."); } else { Http.GetSocket()->OnError(-1, "HTTP didn't complete."); Out.Close(); Dlg->StartFromByte = LFileSize(Dlg->File); if (ProtocolStatus < 0 && ContentLen > 0 && Dlg->StartFromByte < ContentLen) { goto DoConnect; } } } else { char Str[256]; sprintf_s(Str, sizeof(Str), "Couldn't open '%s' for writing.", Dlg->File.Get()); if (Http.GetSocket()) Http.GetSocket()->OnInformation(Str); } Parent->CmdConnect.Enabled(true); Parent->CmdHttp.Enabled(true); Parent->CmdAbort.Enabled(false); if (Parent->Local) { Parent->Local->UpdateList(); } } else if (Http.GetSocket()) { Http.GetSocket()->OnInformation("Couldn't connect to server."); } } else { LgiTrace("%s:%i - User arguments missing.\n", _FL); } } else { LgiTrace("%s:%i - Parameter error.\n", _FL); } if (Parent) { Parent->Http = 0; } return 0; }