Beispiel #1
0
        private void Sync_BACKGROUND(SyncControlGridItem sync_control_grid_item)
        {
            StatusManager.Instance.UpdateStatus(StatusCodes.SYNC_META(sync_control_grid_item.library_sync_detail.web_library_detail), String.Format("Starting sync of {0}", sync_control_grid_item.LibraryTitle));

            var  sd            = sync_control_grid_item.library_sync_detail;
            bool done_anything = false;

            try
            {
                IntranetLibraryDetail.EnsureIntranetLibraryExists(sync_control_grid_item.library_sync_detail.web_library_detail);

                if (sync_control_grid_item.SyncLibrary)
                {
                    if (sd.sync_decision.can_sync)
                    {
                        Logging.Info("Syncing metadata for {0}", sd.web_library_detail.Title);
                        SynchronizeMetadata_INTERNAL_BACKGROUND(sd.web_library_detail, sync_control_grid_item.IsReadOnly);
                        SynchronizeDocuments_Upload_INTERNAL_BACKGROUND(sd.web_library_detail, sd.web_library_detail.Xlibrary.PDFDocuments, sync_control_grid_item.IsReadOnly);
                        Logging.Info("Downloading documents for {0}", sd.web_library_detail.Title);
                        SynchronizeDocuments_Download_INTERNAL_BACKGROUND(sd.web_library_detail, sd.web_library_detail.Xlibrary.PDFDocuments, sync_control_grid_item.IsReadOnly);
                        done_anything = true;
                    }
                    else
                    {
                        Logging.Info("Not synchronizing metadata or documents for {0}", sd.web_library_detail.Title);
                    }
                }

                // Indicate that we have synced
                if (done_anything)
                {
                    var now = DateTime.UtcNow;

                    sd.web_library_detail.LastSynced = now;

                    string syncfilepath = HistoricalSyncFile.GetSyncDbFilename(sd.web_library_detail);
                    File.SetCreationTimeUtc(syncfilepath, now);
                    File.SetLastWriteTimeUtc(syncfilepath, now);
                }
            }
            catch (Exception ex)
            {
                Logging.Error(ex, "There was a problem while trying to connect to this Intranet Library?  Are you sure you have permission to access this folder?  Your Network or System Administrator can grant you this permission.\n\nThe detailed error message is:\n" + ex.Message);
            }
            finally
            {
                sd.web_library_detail.Xlibrary.sync_in_progress = false;

                WebLibraryManager.Instance.NotifyOfChangeToWebLibraryDetail();
            }

            StatusManager.Instance.UpdateStatus(StatusCodes.SYNC_META(sd.web_library_detail), String.Format("Finished sync of {0}", sync_control_grid_item.LibraryTitle));
        }
        private void SynchronizeMetadata_INTERNAL_BACKGROUND(Library library, bool restricted_metadata_sync, bool is_readonly)
        {
            Dictionary <string, string> historical_sync_file = HistoricalSyncFile.GetHistoricalSyncFile(library);

            try
            {
                SynchronisationStates ss = SynchronisationStateBuilder.Build(library, historical_sync_file);
                SynchronisationAction sa = SynchronisationActionBuilder.Build(library, ss);
                SynchronisationExecutor.Sync(library, restricted_metadata_sync, is_readonly, historical_sync_file, sa);
            }
            catch (Exception ex)
            {
                UnhandledExceptionMessageBox.DisplayException(ex);
            }

            HistoricalSyncFile.PutHistoricalSyncFile(library, historical_sync_file);
        }
Beispiel #3
0
        internal void DoMaintenance()
        {
            WPFDoEvents.AssertThisCodeIs_NOT_RunningInTheUIThread();

            List <string>           library_identifiers = new List <string>();
            List <WebLibraryDetail> web_library_details = WebLibraryManager.Instance.WebLibraryDetails_WorkingWebLibraries;

            List <WebLibraryDetail> libraries_to_sync = new List <WebLibraryDetail>();

            foreach (WebLibraryDetail web_library_detail in web_library_details)
            {
                // This needs to be written for intranet libraries
                //
                // The best way to do it might be, at the end of a sync, to write a timestamp
                // to the shared folder at the end of a sync, and write that same timestamp to
                // library.WebLibraryDetail.LastSynced
                //
                // That way, if the timestamp in the shared folder has been changed
                // to what our client last saw, we know we need to sync.
                //
                if (web_library_detail.AutoSync)
                {
                    string   syncfilepath = HistoricalSyncFile.GetSyncDbFilename(web_library_detail);
                    DateTime dt           = File.Exists(syncfilepath) ? File.GetLastWriteTimeUtc(syncfilepath) : WebLibraryManager.DATE_ZERO;

                    if (dt != (web_library_detail.LastSynced ?? WebLibraryManager.DATE_ZERO))
                    {
                        Logging.Info("Library {0} is in need of a sync - and has been flagged for autosync", web_library_detail.Title);
                        libraries_to_sync.Add(web_library_detail);
                    }
                }
            }

            if (0 < libraries_to_sync.Count)
            {
                Logging.Info("At least one library needs to autosync");
                WebLibraryManager.Instance.NotifyOfChangeToWebLibraryDetail();

                LibrarySyncManager.SyncRequest sync_request = new LibrarySyncManager.SyncRequest(wants_user_intervention: false, libraries_to_sync, suppress_already_in_progress_notification: true);
                WPFDoEvents.InvokeInUIThread(() =>
                                             LibrarySyncManager.Instance.RequestSync(sync_request)
                                             );
            }
        }
Beispiel #4
0
        // -------------------------------------------------------------------------------------------------------------------------------------------------------

        internal void Sync(SyncControlGridItemSet sync_control_grid_item_set)
        {
            Logging.Info("Syncing");

            foreach (SyncControlGridItem sync_control_grid_item_temp in sync_control_grid_item_set.grid_items)
            {
                // Needed for passing to background thread...
                SyncControlGridItem sync_control_grid_item = sync_control_grid_item_temp;
                WebLibraryDetail    web_library_detail     = sync_control_grid_item.library_sync_detail.web_library_detail;

                if (!web_library_detail.IsIntranetLibrary)
                {
                    string local_sync_db = HistoricalSyncFile.GetSyncDbFilename(web_library_detail);

                    if (File.Exists(local_sync_db))
                    {
                        Logging.Warn("INTEGRITY CHECK 'CURIOSITY': library '{0}' has a Historical Sync file at '{1}', while at the same time seems to NOT HAVE a Sync Point a.k.a. Share Target set and thus cannot be synced. The presense of the Histrorical Sync File indicates that this library has had a Sync Point sometime in the past.", web_library_detail, local_sync_db);
                    }

                    Logging.Warn("SYNC IGNORE: library '{0}' has no Sync Point a.k.a. Share Target set and thus cannot be synced.", web_library_detail);
                }

                if (web_library_detail.Xlibrary.sync_in_progress)
                {
                    if (!sync_control_grid_item_set.sync_request.suppress_already_in_progress_notification)
                    {
                        MessageBoxes.Info("A sync operation is already in progress for library {0}.  Please wait for it to finish before trying to sync again.", web_library_detail.Title);
                    }
                    else
                    {
                        Logging.Info("A sync operation is already in progress for library {0}.  This has been suppressed from the GUI.", web_library_detail.Title);
                    }
                }
                else
                {
                    if (sync_control_grid_item.SyncLibrary)
                    {
                        web_library_detail.Xlibrary.sync_in_progress = true;
                        SafeThreadPool.QueueUserWorkItem(o => Sync_BACKGROUND(sync_control_grid_item));
                    }
                }
            }
        }