X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/6b129e2d40c5982cef5e31c3e6851ece81f6aab1..df4b83cb75915caaf7ad49848ebb6d340045478b:/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java diff --git a/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java b/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java index ad880682..43b15477 100644 --- a/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java +++ b/src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java @@ -1,140 +1,142 @@ -/* ownCloud Android client application - * Copyright (C) 2011 Bartek Przybylski - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package eu.alefzero.owncloud.syncadapter; - -import java.io.IOException; - -import org.apache.http.entity.StringEntity; - -import android.accounts.Account; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.content.ContentProviderClient; -import android.content.ContentValues; -import android.content.Context; -import android.content.SyncResult; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.os.RemoteException; -import android.util.Log; -import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta; -import eu.alefzero.webdav.HttpPropFind; -import eu.alefzero.webdav.TreeNode; -import eu.alefzero.webdav.TreeNode.NodeProperty; -import eu.alefzero.webdav.WebdavUtils; - -/** - * SyncAdapter implementation for syncing sample SyncAdapter contacts to the - * platform ContactOperations provider. - */ -public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { - private static final String TAG = "FileSyncAdapter"; - - public FileSyncAdapter(Context context, boolean autoInitialize) { - super(context, autoInitialize); - } - - @Override - public synchronized void onPerformSync( - Account account, - Bundle extras, - String authority, - ContentProviderClient provider, - SyncResult syncResult) { - - try { - this.setAccount(account); - this.setContentProvider(provider); - - HttpPropFind query = this.getBasicQuery(); - query.setEntity(new StringEntity(WebdavUtils.prepareXmlForPropFind())); - TreeNode root = this.fireQuery(query); - - commitToDatabase(root, null); - } catch (OperationCanceledException e) { - e.printStackTrace(); - } catch (AuthenticatorException e) { - syncResult.stats.numAuthExceptions++; - e.printStackTrace(); - } catch (IOException e) { - syncResult.stats.numIoExceptions++; - e.printStackTrace(); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - - private void commitToDatabase(TreeNode root, String parentId) throws RemoteException { - for (TreeNode n : root.getChildList()) { - Log.d(TAG, n.toString()); - ContentValues cv = new ContentValues(); - cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, n.getProperty(NodeProperty.CONTENT_LENGTH)); - cv.put(ProviderTableMeta.FILE_MODIFIED, n.getProperty(NodeProperty.LAST_MODIFIED_DATE)); - cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, n.getProperty(NodeProperty.RESOURCE_TYPE)); - cv.put(ProviderTableMeta.FILE_PARENT, parentId); - - String name = n.getProperty(NodeProperty.NAME), - path = n.getProperty(NodeProperty.PATH); - Cursor c = this.getContentProvider().query(ProviderTableMeta.CONTENT_URI_FILE, - null, - ProviderTableMeta.FILE_NAME+"=? AND " + ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?", - new String[]{name, path, this.getAccount().name}, - null); - if (c.moveToFirst()) { - this.getContentProvider().update(ProviderTableMeta.CONTENT_URI, - cv, - ProviderTableMeta._ID+"=?", - new String[]{c.getString(c.getColumnIndex(ProviderTableMeta._ID))}); - Log.d(TAG, "ID of: "+name+":"+c.getString(c.getColumnIndex(ProviderTableMeta._ID))); - } else { - cv.put(ProviderTableMeta.FILE_NAME, n.getProperty(NodeProperty.NAME)); - cv.put(ProviderTableMeta.FILE_PATH, n.getProperty(NodeProperty.PATH)); - cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, this.getAccount().name); - Uri entry = this.getContentProvider().insert(ProviderTableMeta.CONTENT_URI_FILE, cv); - Log.d(TAG, "Inserting new entry " + path + name); - c = this.getContentProvider().query(entry, null, null, null, null); - c.moveToFirst(); - } - if (n.getProperty(NodeProperty.RESOURCE_TYPE).equals("DIR")) { - commitToDatabase(n, c.getString(c.getColumnIndex(ProviderTableMeta._ID))); - } - } - // clean removed files - String[] selection = new String[root.getChildList().size()+2]; - selection[0] = this.getAccount().name; - selection[1] = parentId; - String qm = ""; - for (int i = 2; i < selection.length-1; ++i) { - qm += "?,"; - selection[i] = root.getChildList().get(i-2).getProperty(NodeProperty.NAME); - } - if (selection.length >= 3) { - selection[selection.length-1] = root.getChildrenNames()[selection.length-3]; - qm += "?"; - } - for (int i = 0; i < selection.length; ++i) { - Log.d(TAG,selection[i]+""); - } - Log.d(TAG,"Removing files "+ parentId); - this.getContentProvider().delete(ProviderTableMeta.CONTENT_URI, - ProviderTableMeta.FILE_ACCOUNT_OWNER+"=? AND " + ProviderTableMeta.FILE_PARENT + (parentId==null?" IS ":"=")+"? AND " + ProviderTableMeta.FILE_NAME + " NOT IN ("+qm+")", - selection); - } -} +/* ownCloud Android client application + * Copyright (C) 2011 Bartek Przybylski + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package eu.alefzero.owncloud.syncadapter; + +import java.io.IOException; + +import org.apache.http.entity.StringEntity; + +import android.accounts.Account; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.content.ContentProviderClient; +import android.content.ContentValues; +import android.content.Context; +import android.content.SyncResult; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.os.RemoteException; +import android.util.Log; +import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta; +import eu.alefzero.webdav.HttpPropFind; +import eu.alefzero.webdav.TreeNode; +import eu.alefzero.webdav.TreeNode.NodeProperty; +import eu.alefzero.webdav.WebdavUtils; + +/** + * SyncAdapter implementation for syncing sample SyncAdapter contacts to the + * platform ContactOperations provider. + * + * @author Bartek Przybylski + */ +public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter { + private static final String TAG = "FileSyncAdapter"; + + public FileSyncAdapter(Context context, boolean autoInitialize) { + super(context, autoInitialize); + } + + @Override + public synchronized void onPerformSync( + Account account, + Bundle extras, + String authority, + ContentProviderClient provider, + SyncResult syncResult) { + + try { + this.setAccount(account); + this.setContentProvider(provider); + + HttpPropFind query = this.getPropFindQuery(); + query.setEntity(new StringEntity(WebdavUtils.prepareXmlForPropFind())); + TreeNode root = this.fireRequest(query); + + // commitToDatabase(root, null); + } catch (OperationCanceledException e) { + e.printStackTrace(); + } catch (AuthenticatorException e) { + syncResult.stats.numAuthExceptions++; + e.printStackTrace(); + } catch (IOException e) { + syncResult.stats.numIoExceptions++; + e.printStackTrace(); + }// catch (RemoteException e) { + // e.printStackTrace(); + // q} + } + + private void commitToDatabase(TreeNode root, String parentId) throws RemoteException { + for (TreeNode n : root.getChildList()) { + Log.d(TAG, n.toString()); + ContentValues cv = new ContentValues(); + cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, n.getProperty(NodeProperty.CONTENT_LENGTH)); + cv.put(ProviderTableMeta.FILE_MODIFIED, n.getProperty(NodeProperty.LAST_MODIFIED_DATE)); + cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, n.getProperty(NodeProperty.RESOURCE_TYPE)); + cv.put(ProviderTableMeta.FILE_PARENT, parentId); + + String name = n.getProperty(NodeProperty.NAME), + path = n.getProperty(NodeProperty.PATH); + Cursor c = this.getContentProvider().query(ProviderTableMeta.CONTENT_URI_FILE, + null, + ProviderTableMeta.FILE_NAME+"=? AND " + ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?", + new String[]{name, path, this.getAccount().name}, + null); + if (c.moveToFirst()) { + this.getContentProvider().update(ProviderTableMeta.CONTENT_URI, + cv, + ProviderTableMeta._ID+"=?", + new String[]{c.getString(c.getColumnIndex(ProviderTableMeta._ID))}); + Log.d(TAG, "ID of: "+name+":"+c.getString(c.getColumnIndex(ProviderTableMeta._ID))); + } else { + cv.put(ProviderTableMeta.FILE_NAME, n.getProperty(NodeProperty.NAME)); + cv.put(ProviderTableMeta.FILE_PATH, n.getProperty(NodeProperty.PATH)); + cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, this.getAccount().name); + Uri entry = this.getContentProvider().insert(ProviderTableMeta.CONTENT_URI_FILE, cv); + Log.d(TAG, "Inserting new entry " + path); + c = this.getContentProvider().query(entry, null, null, null, null); + c.moveToFirst(); + } + if (n.getProperty(NodeProperty.RESOURCE_TYPE).equals("DIR")) { + commitToDatabase(n, c.getString(c.getColumnIndex(ProviderTableMeta._ID))); + } + } + // clean removed files + String[] selection = new String[root.getChildList().size()+2]; + selection[0] = this.getAccount().name; + selection[1] = parentId; + String qm = ""; + for (int i = 2; i < selection.length-1; ++i) { + qm += "?,"; + selection[i] = root.getChildList().get(i-2).getProperty(NodeProperty.NAME); + } + if (selection.length >= 3) { + selection[selection.length-1] = root.getChildrenNames()[selection.length-3]; + qm += "?"; + } + for (int i = 0; i < selection.length; ++i) { + Log.d(TAG,selection[i]+""); + } + Log.d(TAG,"Removing files "+ parentId); + this.getContentProvider().delete(ProviderTableMeta.CONTENT_URI, + ProviderTableMeta.FILE_ACCOUNT_OWNER+"=? AND " + ProviderTableMeta.FILE_PARENT + (parentId==null?" IS ":"=")+"? AND " + ProviderTableMeta.FILE_NAME + " NOT IN ("+qm+")", + selection); + } +}