//--------------------------------------------------------------------------- void TActionLog::ReflectSettings() { TGuard Guard(FCriticalSection); bool ALogging = !FClosed && FConfiguration->GetLogActions() && GetEnabled(); if (ALogging && !FLogging) { FLogging = true; Add(L"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); Add(FORMAT(L"<session xmlns=\"http://winscp.net/schema/session/1.0\" name=\"%s\" start=\"%s\">", XmlAttributeEscape(FSessionData->GetSessionName()).c_str(), StandardTimestamp().c_str())); } else if (!ALogging && FLogging) { if (FInGroup) { EndGroup(); } // do not try to close the file, if it has not been opened, to avoid recursion if (FFile != nullptr) { Add(L"</session>"); } CloseLogFile(); FLogging = false; } }
//--------------------------------------------------------------------------- void TActionLog::BeginGroup(const UnicodeString & Name) { assert(!FInGroup); FInGroup = true; assert(FIndent == L" "); AddIndented(FORMAT(L"<group name=\"%s\" start=\"%s\">", XmlAttributeEscape(Name).c_str(), StandardTimestamp().c_str())); FIndent = L" "; }
void Modification(const TDateTime & DateTime) { Parameter(L"modification", StandardTimestamp(DateTime)); }
bool Record() { bool Result = (FState != Opened); if (Result) { if (FLog->FLogging && (FState != Cancelled)) { const wchar_t * Name = ActionName(); UnicodeString Attrs; if (FRecursive) { Attrs = L" recursive=\"true\""; } FLog->AddIndented(FORMAT(L"<%s%s>", Name, Attrs.c_str())); for (intptr_t Index = 0; Index < FNames->GetCount(); ++Index) { UnicodeString Value = FValues->GetString(Index); if (Value.IsEmpty()) { FLog->AddIndented(FORMAT(L" <%s />", FNames->GetString(Index).c_str())); } else { FLog->AddIndented(FORMAT(L" <%s value=\"%s\" />", FNames->GetString(Index).c_str(), XmlAttributeEscape(Value).c_str())); } } if (FFileList != nullptr) { FLog->AddIndented(L" <files>"); for (intptr_t Index = 0; Index < FFileList->GetCount(); ++Index) { TRemoteFile * File = FFileList->GetFile(Index); FLog->AddIndented(L" <file>"); FLog->AddIndented(FORMAT(L" <filename value=\"%s\" />", XmlAttributeEscape(File->GetFileName()).c_str())); FLog->AddIndented(FORMAT(L" <type value=\"%s\" />", XmlAttributeEscape(File->GetType()).c_str())); if (!File->GetIsDirectory()) { FLog->AddIndented(FORMAT(L" <size value=\"%s\" />", Int64ToStr(File->GetSize()).c_str())); } FLog->AddIndented(FORMAT(L" <modification value=\"%s\" />", StandardTimestamp(File->GetModification()).c_str())); FLog->AddIndented(FORMAT(L" <permissions value=\"%s\" />", XmlAttributeEscape(File->GetRights()->GetText()).c_str())); FLog->AddIndented(L" </file>"); } FLog->AddIndented(L" </files>"); } if (FFile != nullptr) { FLog->AddIndented(L" <file>"); FLog->AddIndented(FORMAT(L" <type value=\"%s\" />", XmlAttributeEscape(FFile->GetType()).c_str())); if (!FFile->GetIsDirectory()) { FLog->AddIndented(FORMAT(L" <size value=\"%s\" />", Int64ToStr(FFile->GetSize()).c_str())); } FLog->AddIndented(FORMAT(L" <modification value=\"%s\" />", StandardTimestamp(FFile->GetModification()).c_str())); FLog->AddIndented(FORMAT(L" <permissions value=\"%s\" />", XmlAttributeEscape(FFile->GetRights()->GetText()).c_str())); FLog->AddIndented(L" </file>"); } if (FState == RolledBack) { if (FErrorMessages != nullptr) { FLog->AddIndented(L" <result success=\"false\">"); FLog->AddMessages(L" ", FErrorMessages); FLog->AddIndented(L" </result>"); } else { FLog->AddIndented(L" <result success=\"false\" />"); } } else { FLog->AddIndented(L" <result success=\"true\" />"); } FLog->AddIndented(FORMAT(L"</%s>", Name)); } delete this; } return Result; }
bool __fastcall Record() { bool Result = (FState != Opened); if (Result) { if (FLog->FLogging && (FState != Cancelled)) { const wchar_t * Name = ActionName(); UnicodeString Attrs; if (FRecursive) { Attrs = L" recursive=\"true\""; } FLog->AddIndented(FORMAT(L"<%s%s>", (Name, Attrs))); for (int Index = 0; Index < FNames->Count; Index++) { UnicodeString Value = FValues->Strings[Index]; if (Value.IsEmpty()) { FLog->AddIndented(FORMAT(L" <%s />", (FNames->Strings[Index]))); } else { FLog->AddIndented(FORMAT(L" <%s value=\"%s\" />", (FNames->Strings[Index], XmlAttributeEscape(Value)))); } } if (FFileList != NULL) { FLog->AddIndented(L" <files>"); for (int Index = 0; Index < FFileList->Count; Index++) { TRemoteFile * File = FFileList->Files[Index]; FLog->AddIndented(L" <file>"); FLog->AddIndented(FORMAT(L" <filename value=\"%s\" />", (XmlAttributeEscape(File->FileName)))); FLog->AddIndented(FORMAT(L" <type value=\"%s\" />", (XmlAttributeEscape(File->Type)))); if (!File->IsDirectory) { FLog->AddIndented(FORMAT(L" <size value=\"%s\" />", (IntToStr(File->Size)))); } FLog->AddIndented(FORMAT(L" <modification value=\"%s\" />", (StandardTimestamp(File->Modification)))); FLog->AddIndented(FORMAT(L" <permissions value=\"%s\" />", (XmlAttributeEscape(File->Rights->Text)))); FLog->AddIndented(L" </file>"); } FLog->AddIndented(L" </files>"); } if (FFile != NULL) { FLog->AddIndented(L" <file>"); FLog->AddIndented(FORMAT(L" <type value=\"%s\" />", (XmlAttributeEscape(FFile->Type)))); if (!FFile->IsDirectory) { FLog->AddIndented(FORMAT(L" <size value=\"%s\" />", (IntToStr(FFile->Size)))); } FLog->AddIndented(FORMAT(L" <modification value=\"%s\" />", (StandardTimestamp(FFile->Modification)))); FLog->AddIndented(FORMAT(L" <permissions value=\"%s\" />", (XmlAttributeEscape(FFile->Rights->Text)))); FLog->AddIndented(L" </file>"); } if (FState == RolledBack) { if (FErrorMessages != NULL) { FLog->AddIndented(L" <result success=\"false\">"); FLog->AddMessages(L" ", FErrorMessages); FLog->AddIndented(L" </result>"); } else { FLog->AddIndented(L" <result success=\"false\" />"); } } else { FLog->AddIndented(L" <result success=\"true\" />"); } FLog->AddIndented(FORMAT(L"</%s>", (Name))); } delete this; } return Result; }