diff --git a/lib.go b/lib.go index 8823381..73ff576 100644 --- a/lib.go +++ b/lib.go @@ -775,7 +775,7 @@ func c_CheckDownloadStatus(profilePtr *C.char, profileLen C.int, fileKeyPtr *C.c func CheckDownloadStatus(profileOnion, fileKey string) { profile := application.GetPeer(profileOnion) path, _ := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.path", fileKey)) - if _, exists := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.complete", fileKey)); exists { + if value, exists := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.complete", fileKey)); exists && value == event.True { eventHandler.Push(event.NewEvent(event.FileDownloaded, map[event.Field]string{ ProfileOnion: profileOnion, event.FileKey: fileKey, diff --git a/utils/eventHandler.go b/utils/eventHandler.go index 32cf941..1e80136 100644 --- a/utils/eventHandler.go +++ b/utils/eventHandler.go @@ -3,6 +3,7 @@ package utils import ( "encoding/json" "fmt" + "os" "strconv" "cwtch.im/cwtch/app" @@ -113,7 +114,8 @@ func (eh *EventHandler) handleAppBusEvent(e *event.Event) string { // If the user has chosen to block unknown profiles // then explicitly configure the protocol engine to do so.. - if ReadGlobalSettings().BlockUnknownConnections { + settings := ReadGlobalSettings() + if settings.BlockUnknownConnections { profile.BlockUnknownConnections() } else { // For completeness @@ -181,7 +183,7 @@ func (eh *EventHandler) handleAppBusEvent(e *event.Event) string { if conversationInfo.IsGroup() { cpicPath = RandomGroupImage(conversationInfo.Handle) } else { - cpicPath = GetProfileImage(profile, conversationInfo) + cpicPath = GetProfileImage(profile, conversationInfo, settings.DownloadPath) } // Resolve Save History Setting @@ -255,12 +257,16 @@ func (eh *EventHandler) handleAppBusEvent(e *event.Event) string { return string(json) } -func GetProfileImage(profile peer.CwtchPeer, conversationInfo *model.Conversation) string { +func GetProfileImage(profile peer.CwtchPeer, conversationInfo *model.Conversation, basepath string) string { fileKey, err := profile.GetConversationAttribute(conversationInfo.ID, attr.PublicScope.ConstructScopedZonedPath(attr.ProfileZone.ConstructZonedPath(constants.CustomProfileImageKey))) if err == nil { - if _, exists := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.complete", fileKey)); exists { - image, _ := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.path", fileKey)) - return image + if value, exists := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.complete", fileKey)); exists && value == event.True { + fp, _ := filesharing.GenerateDownloadPath(basepath, fileKey, true) + // check if the file exists...if it does then set the path... + if _, err := os.Stat(fp); err == nil { + image, _ := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.path", fileKey)) + return image + } } } return RandomProfileImage(conversationInfo.Handle) @@ -284,7 +290,7 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string { if ci != nil && err == nil { ev.Event.Data[event.ConversationID] = strconv.Itoa(ci.ID) profile.SetConversationAttribute(ci.ID, attr.LocalScope.ConstructScopedZonedPath(attr.ProfileZone.ConstructZonedPath(constants2.Archived)), event.False) - ev.Event.Data[constants2.Picture] = GetProfileImage(profile, ci) + ev.Event.Data[constants2.Picture] = GetProfileImage(profile, ci, ReadGlobalSettings().DownloadPath) } else { // TODO This Conversation May Not Exist Yet...But we are not in charge of creating it... log.Errorf("todo wait for contact to be added before processing this event...") @@ -318,7 +324,7 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string { ev.Event.Data["Nick"] = ev.Event.Data["RemotePeer"] } } - ev.Event.Data[constants2.Picture] = GetProfileImage(profile, ci) + ev.Event.Data[constants2.Picture] = GetProfileImage(profile, ci, ReadGlobalSettings().DownloadPath) } conversationID, _ := strconv.Atoi(ev.Event.Data[event.ConversationID]) @@ -449,18 +455,26 @@ func (eh *EventHandler) handleProfileEvent(ev *EventProfileEnvelope) string { fileKey := val fsf, err := filesharing.FunctionalityGate(settings.Experiments) imagePreviewsEnabled := settings.Experiments["filesharing-images"] - if err == nil && imagePreviewsEnabled { + if err == nil && imagePreviewsEnabled && conversation.Accepted { + basepath := settings.DownloadPath fp, mp := filesharing.GenerateDownloadPath(basepath, fileKey, true) + + if value, exists := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.complete", fileKey)); exists && value == event.True { + if _, err := os.Stat(fp); err == nil { + // file is marked as completed downloaded and exists... + return "" + } else { + // the user probably deleted the file, mark completed as false... + profile.SetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.complete", fileKey), event.False) + } + } + log.Debugf("Downloading Profile Image %v %v %v", fp, mp, fileKey) ev.Event.Data[event.FilePath] = fp - if _, exists := profile.GetScopedZonedAttribute(attr.LocalScope, attr.FilesharingZone, fmt.Sprintf("%s.complete", fileKey)); exists { - ev.Event.Data[event.FileDownloadFinished] = constants.True - } else { - ev.Event.Data[event.FileDownloadFinished] = constants.False - fsf.DownloadFile(profile, conversation.ID, fp, mp, val, constants.ImagePreviewMaxSizeInBytes) - } + fsf.DownloadFile(profile, conversation.ID, fp, mp, val, constants.ImagePreviewMaxSizeInBytes) } else { + // if image previews are disabled then ignore this event... return "" } }