import org.apache.jackrabbit.webdav.DavException;\r
import org.apache.jackrabbit.webdav.MultiStatus;\r
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;\r
+import org.json.JSONObject;\r
\r
+import com.owncloud.android.AccountUtils;\r
import com.owncloud.android.R;\r
+import com.owncloud.android.authenticator.AccountAuthenticator;\r
import com.owncloud.android.datamodel.FileDataStorageManager;\r
import com.owncloud.android.datamodel.OCFile;\r
import com.owncloud.android.files.services.FileDownloader;\r
+import com.owncloud.android.utils.OwnCloudVersion;\r
\r
import android.accounts.Account;\r
import android.app.Notification;\r
Log.d(TAG, "syncing owncloud account " + account.name);\r
\r
sendStickyBroadcast(true, null); // message to signal the start to the UI\r
+ \r
+ updateOCVersion();\r
\r
String uri = getUri().toString();\r
PropFindMethod query = null;\r
\r
private void fetchData(String uri, SyncResult syncResult, long parentId) {\r
PropFindMethod query = null;\r
+ Vector<OCFile> children = null;\r
try {\r
Log.d(TAG, "fetching " + uri);\r
\r
Intent intent = new Intent(this.getContext(), FileDownloader.class);\r
intent.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount());\r
intent.putExtra(FileDownloader.EXTRA_FILE, file);\r
- /*intent.putExtra(FileDownloader.EXTRA_FILE_PATH, file.getRemotePath());\r
- intent.putExtra(FileDownloader.EXTRA_REMOTE_PATH, file.getRemotePath());\r
- intent.putExtra(FileDownloader.EXTRA_FILE_SIZE, file.getFileLength());*/\r
file.setKeepInSync(true);\r
getContext().startService(intent);\r
}\r
\r
// Log.v(TAG, "adding file: " + file);\r
updatedFiles.add(file);\r
- if (parentId == 0)\r
- parentId = file.getFileId();\r
}\r
/* Commented code for ugly performance tests\r
long saveDelay = System.currentTimeMillis();\r
*/\r
\r
// removal of obsolete files\r
- Vector<OCFile> files = getStorageManager().getDirectoryContent(\r
+ children = getStorageManager().getDirectoryContent(\r
getStorageManager().getFileById(parentId));\r
OCFile file;\r
String currentSavePath = FileDownloader.getSavePath(getAccount().name);\r
- for (int i=0; i < files.size(); ) {\r
- file = files.get(i);\r
+ for (int i=0; i < children.size(); ) {\r
+ file = children.get(i);\r
if (file.getLastSyncDate() != mCurrentSyncTime) {\r
Log.v(TAG, "removing file: " + file);\r
getStorageManager().removeFile(file, (file.isDown() && file.getStoragePath().startsWith(currentSavePath)));\r
- files.remove(i);\r
+ children.remove(i);\r
} else {\r
i++;\r
}\r
}\r
\r
- // recursive fetch\r
- for (int i=0; i < files.size() && !mCancellation; i++) {\r
- OCFile newFile = files.get(i);\r
- if (newFile.getMimetype().equals("DIR")) {\r
- fetchData(getUri().toString() + WebdavUtils.encodePath(newFile.getRemotePath()), syncResult, newFile.getFileId());\r
- }\r
- }\r
- if (mCancellation) Log.d(TAG, "Leaving " + uri + " because cancelation request");\r
- \r
- /* Commented code for ugly performance tests\r
- mResponseDelays[mDelaysIndex] = responseDelay;\r
- mSaveDelays[mDelaysIndex] = saveDelay;\r
- mDelaysCount++;\r
- mDelaysIndex++;\r
- if (mDelaysIndex >= MAX_DELAYS)\r
- mDelaysIndex = 0;\r
- */\r
-\r
} else {\r
syncResult.stats.numAuthExceptions++;\r
}\r
// synchronized folder -> notice to UI\r
sendStickyBroadcast(true, getStorageManager().getFileById(parentId).getRemotePath());\r
}\r
+ \r
+ \r
+ fetchChildren(children, syncResult);\r
+ if (mCancellation) Log.d(TAG, "Leaving " + uri + " because cancelation request");\r
+ \r
+ \r
+ /* Commented code for ugly performance tests\r
+ mResponseDelays[mDelaysIndex] = responseDelay;\r
+ mSaveDelays[mDelaysIndex] = saveDelay;\r
+ mDelaysCount++;\r
+ mDelaysIndex++;\r
+ if (mDelaysIndex >= MAX_DELAYS)\r
+ mDelaysIndex = 0;\r
+ */\r
+ \r
}\r
\r
+ /**\r
+ * Synchronize data of folders in the list of received files\r
+ * \r
+ * @param files Files to recursively fetch \r
+ * @param syncResult Updated object to provide results to the Synchronization Manager\r
+ */\r
+ private void fetchChildren(Vector<OCFile> files, SyncResult syncResult) {\r
+ for (int i=0; i < files.size() && !mCancellation; i++) {\r
+ OCFile newFile = files.get(i);\r
+ if (newFile.getMimetype().equals("DIR")) {\r
+ fetchData(getUri().toString() + WebdavUtils.encodePath(newFile.getRemotePath()), syncResult, newFile.getFileId());\r
+ }\r
+ }\r
+ }\r
+\r
+ \r
private OCFile fillOCFile(WebdavEntry we) {\r
OCFile file = new OCFile(we.decodedPath());\r
file.setCreationTimestamp(we.createTimestamp());\r
}\r
}\r
\r
- \r
+ private void updateOCVersion() {\r
+ String statUrl = getAccountManager().getUserData(getAccount(), AccountAuthenticator.KEY_OC_BASE_URL);\r
+ statUrl += AccountUtils.STATUS_PATH;\r
+ \r
+ try {\r
+ String result = getClient().getResultAsString(statUrl);\r
+ if (result != null) {\r
+ try {\r
+ JSONObject json = new JSONObject(result);\r
+ if (json != null && json.getString("version") != null) {\r
+ OwnCloudVersion ocver = new OwnCloudVersion(json.getString("version"));\r
+ if (ocver.isVersionValid()) {\r
+ getAccountManager().setUserData(getAccount(), AccountAuthenticator.KEY_OC_VERSION, ocver.toString());\r
+ Log.d(TAG, "Got new OC version " + ocver.toString());\r
+ } else {\r
+ Log.w(TAG, "Invalid version number received from server: " + json.getString("version"));\r
+ }\r
+ }\r
+ } catch (Throwable e) {\r
+ Log.w(TAG, "Couldn't parse version response", e);\r
+ }\r
+ } else {\r
+ Log.w(TAG, "Problem while getting ocversion from server");\r
+ }\r
+ } catch (Exception e) {\r
+ Log.e(TAG, "Problem getting response from server", e);\r
+ }\r
+ }\r
}\r