@Override
	protected void operationExecute() throws MultiCloudException {
		if (!destinations.isEmpty()) {
			/* create threads and start them */
			listener.setDivisor(destinations.size());
			for (FileCloudSource dst: destinations) {
				pool.add(new FileUploadThread(this, dst, data));
			}
			for (FileUploadThread thread: pool) {
				thread.start();
			}
			for (FileUploadThread thread: pool) {
				try {
					thread.join();
				} catch (InterruptedException e) {
					/* join interrupted */
				}
			}
			listener.finishTransfer();
			if (getError() == null && getResult() == null) {
				FileInfo info = new FileInfo();
				info.setName(data.getName());
				info.setFileType(FileType.FILE);
				setResult(info);
			}
			done = true;
			for (FileUploadThread thread: pool) {
				if (thread.isFailed()) {
					done = false;
					break;
				}
			}
		} else {
			throw new MultiCloudException("No destination specified.");
		}
	}