private bool UploadFolderRecursively(IFolder remoteBaseFolder, string localFolder) // TODO switch order of argument for consistency with methods above and below
{
bool success = true;
SleepWhileSuspended();
IFolder folder = null;
try
{
var syncItem = database.GetFolderSyncItemFromLocalPath(localFolder);
if (null == syncItem)
{
syncItem = SyncItemFactory.CreateFromLocalPath(localFolder, true, repoInfo, database);
}
// Create remote folder.
Dictionary<string, object> properties = new Dictionary<string, object>();
properties.Add(PropertyIds.Name, syncItem.RemoteLeafname);
properties.Add(PropertyIds.ObjectTypeId, "cmis:folder");
properties.Add(PropertyIds.CreationDate, Directory.GetCreationTime(localFolder));
properties.Add(PropertyIds.LastModificationDate, Directory.GetLastWriteTime(localFolder));
try
{
Logger.Debug(String.Format("Creating remote folder {0} for local folder {1}", syncItem.RemoteLeafname, localFolder));
folder = remoteBaseFolder.CreateFolder(properties);
Logger.Debug(String.Format("Created remote folder {0}({1}) for local folder {2}", syncItem.RemoteLeafname, folder.Id, localFolder));
}
catch (CmisNameConstraintViolationException)
{
foreach (ICmisObject cmisObject in remoteBaseFolder.GetChildren())
{
if (cmisObject.Name == syncItem.RemoteLeafname)
{
folder = cmisObject as IFolder;
}
}
if (folder == null)
{
Logger.Warn("Remote file conflict with local folder " + syncItem.LocalLeafname);
// TODO Show error message
return false;
}
success = false;
}
catch (Exception e)
{
ProcessRecoverableException(String.Format("Exception when create remote folder for local folder {0}: {1}", localFolder, e.Message), e);
return false;
}
// Create database entry for this folder
// TODO Add metadata
database.AddFolder(syncItem, folder.Id, folder.LastModificationDate);
Logger.Info("Added folder to database: " + localFolder);
}
catch (CmisBaseException e)
{
ProcessRecoverableException("Could not create remote directory: " + remoteBaseFolder.Path + "/" + Path.GetFileName(localFolder), e);
return false;
}
try
{
// Upload each file in this folder.
foreach (string file in Directory.GetFiles(localFolder))
{
if (Utils.WorthSyncing(localFolder, Path.GetFileName(file), repoInfo))
{
success &= UploadFile(file, folder);
}
}
// Recurse for each subfolder in this folder.
foreach (string subfolder in Directory.GetDirectories(localFolder))
{
if (Utils.WorthSyncing(localFolder, Path.GetFileName(subfolder), repoInfo))
{
success &= UploadFolderRecursively(folder, subfolder);
}
}
}
catch (Exception e)
{
ProcessRecoverableException("Could not upload folder: " + localFolder, e);
return false;
}
return success;
}