public override void InsertItem( object itemData, IEnumerable <SyncId> changeUnitsToCreate, RecoverableErrorReportingContext recoverableErrorReportingContext, out ItemFieldDictionary keyAndUpdatedVersion, out bool commitKnowledgeAfterThisItem ) { IFileDataRetriever dataRetriever = (IFileDataRetriever)itemData; string path = dataRetriever.FileData.RelativePath; keyAndUpdatedVersion = null; commitKnowledgeAfterThisItem = false; try { NotifyChange("Uploading {0}...", path); SyncedNodeAttributes attrs = api.InsertNode(dataRetriever.FileData, path, dataRetriever.FileData.IsDirectory ? null : dataRetriever.FileStream); keyAndUpdatedVersion = new ItemFieldDictionary(); keyAndUpdatedVersion.Add(new ItemField(ItemFields.CUSTOM_FIELD_NAME, typeof(string), attrs.Name)); keyAndUpdatedVersion.Add(new ItemField(ItemFields.CUSTOM_FIELD_ID, typeof(string), attrs.Id)); } catch (ApplicationException e) { NotifyError(e); recoverableErrorReportingContext.RecordRecoverableErrorForChange(new RecoverableErrorData(e)); } }
/// <summary> /// UPDATE /// </summary> /// private void UpdateItem(ItemMetadata item, ItemChange change, SaveChangeContext context) { var data = (IFileDataRetriever)context.ChangeData; var attr = _metadataStore.GetItemInfo(item); var stream = data.FileData.IsDirectory ? null : data.FileStream; try { SyncedNodeAttributes updatedNode = null; //if pathes are different then consider renaming with unchanged content if (attr.Path != data.FileData.RelativePath) { updatedNode = _nodeStore.MoveFile(attr.Path, data.FileData.RelativePath, attr.Id); OnAppliedChange(ChangeType.Rename, data.FileData.RelativePath, attr.Path); } else { updatedNode = _nodeStore.UpdateFile(attr.Path, data.FileData, stream, attr.Id); OnAppliedChange(ChangeType.Update, data.FileData.RelativePath); } item.ChangeVersion = change.ChangeVersion; _metadataStore.SaveItemMetadata(item, updatedNode.Id, updatedNode.Path); } catch (MegaStoreConstraintException e) { ProcessConstraint(change, context, e, item, e.Node); } catch (MegaStoreException e) { ForgetItem(context, item, e); } catch (MegaApiException e) { context.RecordRecoverableErrorForItem(new RecoverableErrorData(e)); OnDemandedResync(); } catch (DirectoryNotFoundException e) { context.RecordRecoverableErrorForItem(new RecoverableErrorData(e)); OnDemandedResync(); } catch (COMException e) { OnDemandedResync(); context.RecordRecoverableErrorForItem(new RecoverableErrorData(e)); } finally { CloseStream(stream); } }