func transfer_retrieve(key string, file string) bool { var nodes []*gomega.Node var node *gomega.Node fullpath := getFullPath(key, getDirHash(key)) root, pathsplit, err := getLookupParams(fullpath, mega.FS) if err != nil { fmt.Printf("TRANSFER-FAILURE RETRIEVE %s %s\n", key, err) return false } if len(*pathsplit) > 0 { nodes, err = mega.FS.PathLookup(root, *pathsplit) } else { err = EINVALID_PATH } if err != nil { fmt.Printf("TRANSFER-FAILURE RETRIEVE %s %s\n", key, err) return false } else { node = nodes[len(nodes)-1] if node.GetType() != gomega.FILE { fmt.Printf("TRANSFER-FAILURE RETRIEVE %s %s\n", key, ENOT_FILE) return false } } info, err := os.Stat(file) if os.IsNotExist(err) { d := path.Dir(file) _, err := os.Stat(d) if os.IsNotExist(err) { fmt.Printf("TRANSFER-FAILURE RETRIEVE %s %s\n", key, EINVALID_DEST) return false } } else { if info.Mode().IsDir() { if strings.HasSuffix(file, "/") { file = path.Join(file, (*pathsplit)[len(*pathsplit)-1]) } else { fmt.Printf("TRANSFER-FAILURE RETRIEVE %s %s\n", key, EDIR_EXISTS) return false } } info, err = os.Stat(file) if os.IsNotExist(err) == false { if info.Size() == node.GetSize() { fmt.Printf("TRANSFER-SUCCESS RETRIEVE %s\n", key) return true } os.Remove(file) if err != nil { fmt.Printf("TRANSFER-FAILURE RETRIEVE %s %s\n", key, EFILE_EXISTS) return false } } err = nil } var ch *chan int var wg sync.WaitGroup ch = new(chan int) *ch = make(chan int) wg.Add(1) go progressBar(*ch, &wg, node.GetSize()) err = mega.DownloadFile(node, file, ch) wg.Wait() if err != nil { fmt.Printf("TRANSFER-FAILURE RETRIEVE %s %s\n", key, err) return false } fmt.Printf("TRANSFER-SUCCESS RETRIEVE %s\n", key) return true }