Skip to content

Commit

Permalink
Bug 572: Amazon S3 protocol (skip transfer)
Browse files Browse the repository at this point in the history
https://winscp.net/tracker/572

Source commit: 1e597b108bf2a27d35539a4b8139244bd6ae4ec2
  • Loading branch information
martinprikryl committed Jan 28, 2018
1 parent 93719a3 commit b3f637d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 13 deletions.
41 changes: 28 additions & 13 deletions source/core/S3FileSystem.cpp
Expand Up @@ -599,11 +599,11 @@ bool __fastcall TS3FileSystem::IsCapable(int Capability) const
case fcRename:
case fcRemoteMove:
case fcMoveToQueue:
case fsSkipTransfer:
return true;

case fcPreservingTimestampUpload:
case fcCheckingSpaceAvailable:
case fsSkipTransfer:
case fsParallelTransfers:
case fcUserGroupListing:
case fcModeChanging:
Expand Down Expand Up @@ -1133,12 +1133,16 @@ void TS3FileSystem::ConfirmOverwrite(
}
}
//---------------------------------------------------------------------------
struct TLibS3PutObjectDataCallbackData : TLibS3CallbackData
struct TLibS3TransferObjectDataCallbackData : TLibS3CallbackData
{
UnicodeString FileName;
TStream * Stream;
TFileOperationProgressType * OperationProgress;
std::auto_ptr<Exception> Exception;
};
//---------------------------------------------------------------------------
struct TLibS3PutObjectDataCallbackData : TLibS3TransferObjectDataCallbackData
{
RawByteString ETag;
};
//---------------------------------------------------------------------------
Expand All @@ -1149,18 +1153,34 @@ int TS3FileSystem::LibS3PutObjectDataCallback(int BufferSize, char * Buffer, voi
return Data.FileSystem->PutObjectData(BufferSize, Buffer, Data);
}
//---------------------------------------------------------------------------
bool TS3FileSystem::ShouldCancelTransfer(TLibS3TransferObjectDataCallbackData & Data)
{
bool Result = (Data.OperationProgress->Cancel != csContinue);
if (Result)
{
if (Data.OperationProgress->ClearCancelFile())
{
Data.Exception.reset(new ESkipFile());
}
else
{
Data.Exception.reset(new EAbort(L""));
}
}
return Result;
}
//---------------------------------------------------------------------------
int TS3FileSystem::PutObjectData(int BufferSize, char * Buffer, TLibS3PutObjectDataCallbackData & Data)
{
int Result;

TFileOperationProgressType * OperationProgress = Data.OperationProgress;
if (OperationProgress->Cancel != csContinue)
if (ShouldCancelTransfer(Data))
{
Data.Exception.reset(new EAbort(L""));
Result = -1;
}
else
{
TFileOperationProgressType * OperationProgress = Data.OperationProgress;
try
{
FILE_OPERATION_LOOP_BEGIN
Expand Down Expand Up @@ -1437,12 +1457,8 @@ void __fastcall TS3FileSystem::CopyToLocal(
FTerminal->DoCopyToLocal(FilesToCopy, TargetDir, CopyParam, Params, OperationProgress, tfNone, OnceDoneOperation);
}
//---------------------------------------------------------------------------
struct TLibS3GetObjectDataCallbackData : TLibS3CallbackData
struct TLibS3GetObjectDataCallbackData : TLibS3TransferObjectDataCallbackData
{
UnicodeString FileName;
TStream * Stream;
TFileOperationProgressType * OperationProgress;
std::auto_ptr<Exception> Exception;
};
//---------------------------------------------------------------------------
S3Status TS3FileSystem::LibS3GetObjectDataCallback(int BufferSize, const char * Buffer, void * CallbackData)
Expand All @@ -1456,14 +1472,13 @@ S3Status TS3FileSystem::GetObjectData(int BufferSize, const char * Buffer, TLibS
{
S3Status Result = S3StatusOK;

TFileOperationProgressType * OperationProgress = Data.OperationProgress;
if (OperationProgress->Cancel != csContinue)
if (ShouldCancelTransfer(Data))
{
Data.Exception.reset(new EAbort(L""));
Result = S3StatusAbortedByCallback;
}
else
{
TFileOperationProgressType * OperationProgress = Data.OperationProgress;
try
{
FILE_OPERATION_LOOP_BEGIN
Expand Down
2 changes: 2 additions & 0 deletions source/core/S3FileSystem.h
Expand Up @@ -9,6 +9,7 @@ struct TOverwriteFileParams;
struct TLibS3CallbackData;
struct TLibS3BucketContext;
struct TLibS3ListBucketCallbackData;
struct TLibS3TransferObjectDataCallbackData;
struct TLibS3PutObjectDataCallbackData;
struct TLibS3GetObjectDataCallbackData;
struct ssl_st;
Expand Down Expand Up @@ -150,6 +151,7 @@ class TS3FileSystem : public TCustomFileSystem
const TCopyParamType * CopyParam, int Params);
int PutObjectData(int BufferSize, char * Buffer, TLibS3PutObjectDataCallbackData & Data);
S3Status GetObjectData(int BufferSize, const char * Buffer, TLibS3GetObjectDataCallbackData & Data);
bool ShouldCancelTransfer(TLibS3TransferObjectDataCallbackData & Data);

static TS3FileSystem * GetFileSystem(void * CallbackData);
static void LibS3SessionCallback(ne_session_s * Session, void * CallbackData);
Expand Down

0 comments on commit b3f637d

Please sign in to comment.