private bool ProcessMusicFolderPath(string path)
        {
            string[] itunes_music_uri_parts = ConvertToLocalUriFormat(path).Split(Path.DirectorySeparatorChar);
            string[] library_uri_parts      = Path.GetDirectoryName(data.library_uri).Split(Path.DirectorySeparatorChar);

            string itunes_dir_name = library_uri_parts[library_uri_parts.Length - 1];
            int    i     = 0;
            bool   found = false;

            for (i = itunes_music_uri_parts.Length - 1; i >= 0; i--)
            {
                if (itunes_music_uri_parts[i] == itunes_dir_name)
                {
                    found = true;
                    break;
                }
            }

            if (!found)
            {
                var builder = new StringBuilder(path.Length - 17);
                for (int j = 3; j < itunes_music_uri_parts.Length; j++)
                {
                    string part = itunes_music_uri_parts[j];
                    builder.Append(part);
                    if (part.Length > 0)
                    {
                        builder.Append(Path.DirectorySeparatorChar);
                    }
                }

                string local_path = builder.ToString();

                System.Threading.Monitor.Enter(mutex);

                ThreadAssist.ProxyToMain(delegate {
                    System.Threading.Monitor.Enter(mutex);
                    using (var dialog = new ItunesMusicDirectoryDialog(local_path)) {
                        if (dialog.Run() == (int)ResponseType.Ok)
                        {
                            data.local_prefix         = dialog.UserMusicDirectory;
                            data.user_provided_prefix = true;
                            data.default_query        = local_path;
                            ok = true;
                        }
                        else
                        {
                            ok = false;
                        }
                        dialog.Destroy();
                        System.Threading.Monitor.Pulse(mutex);
                        System.Threading.Monitor.Exit(mutex);
                    }
                });

                System.Threading.Monitor.Wait(mutex);
                System.Threading.Monitor.Exit(mutex);

                if (ok)
                {
                    return(true);
                }
                else
                {
                    LogError(data.library_uri, "Unable to locate iTunes directory from iTunes URI");
                    return(false);
                }
            }

            string[] tmp_query_dirs = new string[itunes_music_uri_parts.Length];
            string   upstream_uri;
            string   tmp_upstream_uri = null;
            int      step             = 0;
            string   root             = Path.GetPathRoot(data.library_uri);
            bool     same_root        = library_uri_parts[0] == root.Split(Path.DirectorySeparatorChar)[0];

            do
            {
                upstream_uri     = tmp_upstream_uri;
                tmp_upstream_uri = root;
                for (int j = same_root ? 1 : 0; j < library_uri_parts.Length - step - 1; j++)
                {
                    tmp_upstream_uri = Path.Combine(tmp_upstream_uri, library_uri_parts[j]);
                }
                tmp_upstream_uri  = Path.Combine(tmp_upstream_uri, itunes_music_uri_parts[i - step]);
                data.fallback_dir = tmp_query_dirs[step] = itunes_music_uri_parts[i - step];
                step++;
            } while (Banshee.IO.Directory.Exists(tmp_upstream_uri));
            if (upstream_uri == null)
            {
                LogError(data.library_uri, "Unable to resolve iTunes URIs to local URIs");
                return(false);
            }
            data.query_dirs    = new string[step - 2];
            data.default_query = string.Empty;

            for (int j = step - 2; j >= 0; j--)
            {
                if (j > 0)
                {
                    data.query_dirs[j - 1] = tmp_query_dirs[j];
                }
                data.default_query += tmp_query_dirs[j] + Path.DirectorySeparatorChar;
            }

            data.local_prefix = string.Empty;
            for (int j = 0; j <= library_uri_parts.Length - step; j++)
            {
                data.local_prefix += library_uri_parts[j] + Path.DirectorySeparatorChar;
            }

            return(true);
        }
        private bool ProcessMusicFolderPath(string path)
        {
            string[] itunes_music_uri_parts = ConvertToLocalUriFormat (path).Split (Path.DirectorySeparatorChar);
            string[] library_uri_parts = Path.GetDirectoryName (data.library_uri).Split (Path.DirectorySeparatorChar);

            string itunes_dir_name = library_uri_parts[library_uri_parts.Length - 1];
            int i = 0;
            bool found = false;

            for (i = itunes_music_uri_parts.Length - 1; i >= 0; i--) {
                if (itunes_music_uri_parts[i] == itunes_dir_name) {
                    found = true;
                    break;
                }
            }

            if (!found) {
                var builder = new StringBuilder (path.Length - 17);
                for (int j = 3; j < itunes_music_uri_parts.Length; j++) {
                    string part = itunes_music_uri_parts[j];
                    builder.Append (part);
                    if (part.Length > 0) {
                        builder.Append (Path.DirectorySeparatorChar);
                    }
                }

                string local_path = builder.ToString ();

                System.Threading.Monitor.Enter (mutex);

                ThreadAssist.ProxyToMain (delegate {
                    System.Threading.Monitor.Enter (mutex);
                    using (var dialog = new ItunesMusicDirectoryDialog (local_path)) {
                        if (dialog.Run () == (int)ResponseType.Ok) {
                            data.local_prefix = dialog.UserMusicDirectory;
                            data.user_provided_prefix = true;
                            data.default_query = local_path;
                            ok = true;
                        } else {
                            ok = false;
                        }
                        dialog.Destroy ();
                        System.Threading.Monitor.Pulse (mutex);
                        System.Threading.Monitor.Exit (mutex);
                    }
                });

                System.Threading.Monitor.Wait (mutex);
                System.Threading.Monitor.Exit (mutex);

                if (ok) {
                    return true;
                } else {
                    LogError (data.library_uri, "Unable to locate iTunes directory from iTunes URI");
                    return false;
                }
            }

            string[] tmp_query_dirs = new string[itunes_music_uri_parts.Length];
            string upstream_uri;
            string tmp_upstream_uri = null;
            int step = 0;
            string root = Path.GetPathRoot (data.library_uri);
            bool same_root = library_uri_parts[0] == root.Split (Path.DirectorySeparatorChar)[0];
            do {
                upstream_uri = tmp_upstream_uri;
                tmp_upstream_uri = root;
                for (int j = same_root ? 1 : 0; j < library_uri_parts.Length - step - 1; j++) {
                    tmp_upstream_uri = Path.Combine (tmp_upstream_uri, library_uri_parts[j]);
                }
                tmp_upstream_uri = Path.Combine (tmp_upstream_uri, itunes_music_uri_parts[i - step]);
                data.fallback_dir = tmp_query_dirs[step] = itunes_music_uri_parts[i - step];
                step++;
            } while (Banshee.IO.Directory.Exists (tmp_upstream_uri));
            if (upstream_uri == null) {
                LogError (data.library_uri, "Unable to resolve iTunes URIs to local URIs");
                return false;
            }
            data.query_dirs = new string[step - 2];
            data.default_query = string.Empty;

            for (int j = step - 2; j >= 0; j--) {
                if (j > 0) {
                    data.query_dirs[j - 1] = tmp_query_dirs[j];
                }
                data.default_query += tmp_query_dirs[j] + Path.DirectorySeparatorChar;

            }

            data.local_prefix = string.Empty;
            for (int j = 0; j <= library_uri_parts.Length - step; j++) {
                data.local_prefix += library_uri_parts[j] + Path.DirectorySeparatorChar;
            }

            return true;
        }