@@ -26,9 +26,9 @@ public abstract class VirtualEngineBase : EngineWindows
2626 /// </summary>
2727 /// <param name="userName">User name.</param>
2828 /// <returns>True if user name matches currently loged-in user. False - otherwise.</returns>
29- public bool IsCurrentUser ( string userName )
30- {
31- return CurrentUserPrincipal . Equals ( userName , StringComparison . InvariantCultureIgnoreCase ) ;
29+ public bool IsCurrentUser ( string userName )
30+ {
31+ return CurrentUserPrincipal . Equals ( userName , StringComparison . InvariantCultureIgnoreCase ) ;
3232 }
3333
3434 /// <summary>
@@ -59,12 +59,12 @@ public bool IsCurrentUser(string userName)
5959 /// <param name="setLockReadOnly">Mark documents locked by other users as read-only for this user and vice versa.</param>
6060 /// <param name="logFormatter">Formats log output.</param>
6161 public VirtualEngineBase (
62- string license ,
63- string userFileSystemRootPath ,
64- string remoteStorageRootPath ,
62+ string license ,
63+ string userFileSystemRootPath ,
64+ string remoteStorageRootPath ,
6565 string iconsFolderPath ,
6666 bool setLockReadOnly ,
67- LogFormatter logFormatter )
67+ LogFormatter logFormatter )
6868 : base ( license , userFileSystemRootPath )
6969 {
7070 this . iconsFolderPath = iconsFolderPath ?? throw new ArgumentNullException ( nameof ( iconsFolderPath ) ) ;
@@ -73,10 +73,11 @@ public VirtualEngineBase(
7373 // We want our file system to run regardless of any errors.
7474 // If any request to file system fails in user code or in Engine itself we continue processing.
7575 ThrowExceptions = false ;
76-
76+
7777 SetLockReadOnly = setLockReadOnly ;
7878
7979 StateChanged += Engine_StateChanged ;
80+ ItemsChanging += Engine_ItemsChanging ;
8081 ItemsChanged += Engine_ItemsChanged ;
8182 SyncService . StateChanged += SyncService_StateChanged ;
8283 Error += logFormatter . LogError ;
@@ -86,7 +87,55 @@ public VirtualEngineBase(
8687
8788
8889 /// <summary>
89- /// Fired for each file or folder change.
90+ /// Fired before items(s) changes on queing, hydration, upload, population progress.
91+ /// </summary>
92+ private void Engine_ItemsChanging ( Engine sender , ItemsChangeEventArgs e )
93+ {
94+ // Log info about the opertion.
95+ switch ( e . OperationType )
96+ {
97+ case OperationType . Populate :
98+ // Log a single parent folder for folder population.
99+ LogItemChanging ( e , e . Parent ) ;
100+ break ;
101+ default :
102+ // Log each item in the list for all other operations.
103+ foreach ( ChangeEventItem item in e . Items )
104+ {
105+ LogItemChanging ( e , item ) ;
106+ }
107+ break ;
108+ }
109+ }
110+
111+ private void LogItemChanging ( ItemsChangeEventArgs e , ChangeEventItem item )
112+ {
113+ // Log info about the opertion.
114+ ILogger logger = Logger . CreateLogger ( e . ComponentName ) ;
115+ string msg = $ "{ e . Direction } { e . OperationType } :{ e . NotificationTime } ";
116+
117+ // Log progress.
118+ if ( e . NotificationTime . HasFlag ( NotificationTime . Progress ) )
119+ {
120+ long progress = e . Position * 100 / ( e . Length > 0 ? e . Length : 1 ) ;
121+ msg = $ "{ msg } : { progress } %";
122+ }
123+
124+ switch ( e . Source )
125+ {
126+ case OperationSource . Server :
127+ logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext , item . Metadata ) ;
128+ break ;
129+ case OperationSource . Client :
130+ logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext , item . Metadata ) ;
131+ break ;
132+ }
133+ }
134+
135+
136+
137+ /// <summary>
138+ /// Fired after file(s) or folder(s) changed.
90139 /// </summary>
91140 private void Engine_ItemsChanged ( Engine sender , ItemsChangeEventArgs e )
92141 {
@@ -122,42 +171,66 @@ private void Engine_ItemsChanged(Engine sender, ItemsChangeEventArgs e)
122171 break ;
123172 }
124173 }
174+ }
125175
126- // Log info about the opertion.
127- LogItemChange ( e , item ) ;
176+ // Log info about the opertion.
177+ switch ( e . OperationType )
178+ {
179+ case OperationType . Populate :
180+ // Log a single parent folder for folder population.
181+ LogItemChanged ( e , e . Parent ) ;
182+ break ;
183+ default :
184+ // Log each item in the list for all other operations.
185+ foreach ( ChangeEventItem item in e . Items )
186+ {
187+ LogItemChanged ( e , item ) ;
188+ }
189+ break ;
128190 }
129191 }
130-
131- private void LogItemChange ( ItemsChangeEventArgs e , ChangeEventItem item )
192+ private void LogItemChanged ( ItemsChangeEventArgs e , ChangeEventItem item )
132193 {
133194 ILogger logger = Logger . CreateLogger ( e . ComponentName ) ;
134- string msg = $ "{ e . Direction } { e . OperationType } : { e . Result . Status } ";
195+ string msg = $ "{ e . Direction } { e . OperationType } :{ e . NotificationTime } ";
196+
197+ if ( ! e . NotificationTime . HasFlag ( NotificationTime . Progress ) )
198+ {
199+ msg = $ "{ msg } :{ e . Result . Status } ";
200+ }
135201 switch ( e . Result . Status )
136202 {
137203 case OperationStatus . Success :
138- switch ( e . Direction )
204+ // Log progress.
205+ if ( e . NotificationTime . HasFlag ( NotificationTime . Progress ) )
206+ {
207+ long progress = e . Position * 100 / ( e . Length > 0 ? e . Length : 1 ) ;
208+ msg = $ "{ msg } : { progress } %";
209+ }
210+
211+ switch ( e . Source )
139212 {
140- case SyncDirection . Incoming :
141- logger . LogMessage ( msg , item . Path , item . NewPath , e . OperationContext ) ;
213+ case OperationSource . Server :
214+ logger . LogMessage ( msg , item . Path , item . NewPath , e . OperationContext , item . Metadata ) ;
142215 break ;
143- case SyncDirection . Outgoing :
144- logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext ) ;
216+ case OperationSource . Client :
217+ logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext , item . Metadata ) ;
145218 break ;
146219 }
147220 break ;
148221 case OperationStatus . Conflict :
149- logger . LogMessage ( msg , item . Path , item . NewPath , e . OperationContext ) ;
222+ logger . LogMessage ( msg , item . Path , item . NewPath , e . OperationContext , item . Metadata ) ;
150223 break ;
151224 case OperationStatus . Exception :
152- logger . LogError ( msg , item . Path , item . NewPath , e . Result . Exception ) ;
225+ logger . LogError ( msg , item . Path , item . NewPath , e . Result . Exception , e . OperationContext , item . Metadata ) ;
153226 break ;
154227 case OperationStatus . Filtered :
155228 msg = $ "{ msg } by { e . Result . FilteredBy . GetType ( ) . Name } ";
156- logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext ) ;
229+ logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext , item . Metadata ) ;
157230 break ;
158231 default :
159232 msg = $ "{ msg } . { e . Result . Message } ";
160- logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext ) ;
233+ logger . LogDebug ( msg , item . Path , item . NewPath , e . OperationContext , item . Metadata ) ;
161234 break ;
162235 }
163236 }
0 commit comments