X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/62908d175512a1a82bac58fb62dc6389045dff8c..43da474a54718e5cfcd8be06c0aaa5b81b80699e:/src/eu/alefzero/webdav/WebdavClient.java?ds=sidebyside diff --git a/src/eu/alefzero/webdav/WebdavClient.java b/src/eu/alefzero/webdav/WebdavClient.java index f7cc060e..a1dbd098 100644 --- a/src/eu/alefzero/webdav/WebdavClient.java +++ b/src/eu/alefzero/webdav/WebdavClient.java @@ -21,8 +21,7 @@ import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.net.URLDecoder; -import java.net.URLEncoder; +import java.util.HashMap; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HttpClient; @@ -31,28 +30,53 @@ import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.HeadMethod; import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.httpclient.methods.RequestEntity; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.commons.httpclient.protocol.Protocol; import org.apache.http.HttpStatus; +import org.apache.jackrabbit.webdav.client.methods.DavMethod; +import org.apache.jackrabbit.webdav.client.methods.DeleteMethod; import org.apache.jackrabbit.webdav.client.methods.MkColMethod; -import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory; - +import android.accounts.Account; +import android.accounts.AccountManager; +import android.content.Context; import android.net.Uri; import android.util.Log; +import eu.alefzero.owncloud.AccountUtils; +import eu.alefzero.owncloud.authenticator.AccountAuthenticator; +import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory; +import eu.alefzero.owncloud.files.interfaces.OnDatatransferProgressListener; +import eu.alefzero.owncloud.utils.OwnCloudVersion; public class WebdavClient extends HttpClient { private Uri mUri; private Credentials mCredentials; final private static String TAG = "WebdavClient"; private static final String USER_AGENT = "Android-ownCloud"; - private OnUploadProgressListener mUploadProgressListener; - - public WebdavClient(Uri uri) { - mUri = uri; + private OnDatatransferProgressListener mDataTransferListener; + private static HashMap clients = new HashMap(); + + /** + * Creates a WebdavClient setup for the current account + * @param account The client accout + * @param context The application context + * @return + */ + public WebdavClient (Account account, Context context){ + OwnCloudVersion ownCloudVersion = new OwnCloudVersion(AccountManager.get(context).getUserData(account, + AccountAuthenticator.KEY_OC_VERSION)); + String baseUrl = AccountManager.get(context).getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL); + String webDavPath = AccountUtils.getWebdavPath(ownCloudVersion); + String username = account.name.substring(0, account.name.indexOf('@')); + String password = AccountManager.get(context).getPassword(account); + + mUri = Uri.parse(baseUrl + webDavPath); getParams().setParameter(HttpMethodParams.USER_AGENT, USER_AGENT); + setCredentials(username, password); + allowSelfsignedCertificates(); } + + public WebdavClient(){} public void setCredentials(String username, String password) { getParams().setAuthenticationPreemptive(true); @@ -66,25 +90,28 @@ public class WebdavClient extends HttpClient { return mCredentials; } - public void allowUnsignedCertificates() { + public void allowSelfsignedCertificates() { // https Protocol.registerProtocol("https", new Protocol("https", new EasySSLSocketFactory(), 443)); } - public boolean downloadFile(String filepath, File targetPath) { + public boolean downloadFile(String remoteFilepath, File targetPath) { // HttpGet get = new HttpGet(mUri.toString() + filepath.replace(" ", // "%20")); - String[] splitted_filepath = filepath.split("/"); - filepath = ""; + /* dvelasco - this is not necessary anymore; OCFile.mRemotePath (the origin of remoteFielPath) keeps valid URL strings + String[] splitted_filepath = remoteFilepath.split("/"); + remoteFilepath = ""; for (String s : splitted_filepath) { if (s.equals("")) continue; - filepath += "/" + URLEncoder.encode(s); + remoteFilepath += "/" + URLEncoder.encode(s); } - Log.e("ASD", mUri.toString() + filepath.replace(" ", "%20") + ""); + Log.e("ASD", mUri.toString() + remoteFilepath.replace(" ", "%20") + ""); GetMethod get = new GetMethod(mUri.toString() - + filepath.replace(" ", "%20")); + + remoteFilepath.replace(" ", "%20")); + */ + GetMethod get = new GetMethod(mUri.toString() + remoteFilepath); // get.setHeader("Host", mUri.getHost()); // get.setHeader("User-Agent", "Android-ownCloud"); @@ -99,10 +126,13 @@ public class WebdavClient extends HttpClient { get.getResponseBodyAsStream()); FileOutputStream fos = new FileOutputStream(targetPath); - byte[] bytes = new byte[512]; + byte[] bytes = new byte[4096]; int readResult; - while ((readResult = bis.read(bytes)) != -1) + while ((readResult = bis.read(bytes)) != -1) { + if (mDataTransferListener != null) + mDataTransferListener.transferProgress(readResult); fos.write(bytes, 0, readResult); + } } catch (IOException e) { e.printStackTrace(); @@ -110,9 +140,25 @@ public class WebdavClient extends HttpClient { } return true; } + + /** + * Deletes a remote file via webdav + * @param remoteFilePath + * @return + */ + public boolean deleteFile(String remoteFilePath){ + DavMethod delete = new DeleteMethod(mUri.toString() + remoteFilePath); + try { + executeMethod(delete); + } catch (Throwable e) { + Log.e(TAG, "Deleting failed with error: " + e.getMessage(), e); + return false; + } + return true; + } - public void setUploadListener(OnUploadProgressListener listener) { - mUploadProgressListener = listener; + public void setDataTransferProgressListener(OnDatatransferProgressListener listener) { + mDataTransferListener = listener; } public boolean putFile(String localFile, String remoteTarget, @@ -123,7 +169,7 @@ public class WebdavClient extends HttpClient { Log.e("ASD", contentType + ""); File f = new File(localFile); FileRequestEntity entity = new FileRequestEntity(f, contentType); - entity.setOnUploadProgressListener(mUploadProgressListener); + entity.setOnDatatransferProgressListener(mDataTransferListener); Log.e("ASD", f.exists() + " " + entity.getContentLength()); PutMethod put = new PutMethod(mUri.toString() + remoteTarget); put.setRequestEntity(entity); @@ -140,21 +186,29 @@ public class WebdavClient extends HttpClient { return result; } - public int tryToLogin() { - int r = 0; - HeadMethod head = new HeadMethod(mUri.toString()); + /** + * Tries to log in to the given WedDavURI, with the given credentials + * @param uri To test + * @param username Username to check + * @param password Password to verify + * @return A {@link HttpStatus}-Code of the result. SC_OK is good. + */ + public static int tryToLogin(Uri uri, String username, String password) { + int returnCode = 0; + WebdavClient client = new WebdavClient(); + client.setCredentials(username, password); + HeadMethod head = new HeadMethod(uri.toString()); try { - r = executeMethod(head); + returnCode = client.executeMethod(head); } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } - return r; + return returnCode; } public boolean createDirectory(String path) { try { - MkColMethod mkcol = new MkColMethod(mUri.toString() + "/" + path - + "/"); + MkColMethod mkcol = new MkColMethod(mUri.toString() + path); int status = executeMethod(mkcol); Log.d(TAG, "Status returned " + status); Log.d(TAG, "uri: " + mkcol.getURI().toString());