// returns file list of a specific version
        private Dictionary<string, TransferFile> GetVersionFiles(string fullVersion, List<string> updates)
        {
            var newFiles = new Dictionary<string, TransferFile>();
            var deletedFiles = new Dictionary<string, TransferFile>();
            var files = new Dictionary<string, TransferFile>();

            XmlUpdate xmlUpdate = new XmlUpdate();
            XmlFullVersion xmlFullVersion = new XmlFullVersion();

            // order the update configs descending (start with the last update)
            updates = versions.OrderVersions(updates, true);
            foreach (string update in updates)
            {
                // load the update config
                xmlUpdate.Load(localPath + update + "/" + updateConfig, update);

                // add every new file to the list of new files (if it hasn't been added before)
                foreach (TransferFile file in xmlUpdate.NewFiles)
                    if (!newFiles.ContainsKey(file.name)
                        && !deletedFiles.ContainsKey(file.name))
                        newFiles.Add(file.name, file);

                // add every deleted file to the list of files to delete (if it hasn't been added before)
                foreach (TransferFile file in xmlUpdate.DeletedFiles)
                    if (!newFiles.ContainsKey(file.name)
                        && !deletedFiles.ContainsKey(file.name))
                        deletedFiles.Add(file.name, file);
            }

            // load the full version config
            xmlFullVersion.Load(localPath + fullVersion + "/" + fullVersionConfig, fullVersion);

            // add every new file to the list of version files
            foreach (TransferFile file in newFiles.Values)
                files.Add(file.name, file);

            // add every full version file to the list of version files (if it hasn't been added before)
            foreach (TransferFile file in xmlFullVersion.Files)
                if (!files.ContainsKey(file.name) &&
                    !deletedFiles.ContainsKey(file.name))
                    files.Add(file.name, file);

            return files;
        }
        // creates version config and uploads it (async)
        private void UploadVersionConfigs(DelegateTransfer callback)
        {
            var files = new List<TransferFile>();

            // check if version should be a full version
            if (ulFullVersion)
            {
                // create a new full version config and save it to temp folder
                var xmlFullVersion = new XmlFullVersion(ulFiles);
                xmlFullVersion.Save(localPath + fullVersionConfig);
                files.Add(new TransferFile(fullVersionConfig));
            }

            // create a new update config and save it to temp folder
            var xmlUpdate = new XmlUpdate(ulNewFiles, ulDeletedFiles);
            xmlUpdate.Save(localPath + updateConfig);
            files.Add(new TransferFile(updateConfig));

            Uri address = new Uri(remotePath + ulVersion + "/");

            // try to upload configs async
            fileTransfer.UploadFilesAsync(files, false, address, localPath,
                delegate(FileTransferResult result)
                {
                    callback(result == FileTransferResult.Success);
                });
        }