file.setFileId(new_id);
}
}
-
+
if (file.isDirectory() && file.needsUpdatingWhileSaving())
for (OCFile f : getDirectoryContent(file))
saveFile(f);
protected HttpResponse fireRawRequest(HttpRequest query)\r
throws ClientProtocolException, OperationCanceledException,\r
AuthenticatorException, IOException {\r
- BasicHttpContext httpContext = new BasicHttpContext();\r
+ /*BasicHttpContext httpContext = new BasicHttpContext();\r
BasicScheme basicAuth = new BasicScheme();\r
httpContext.setAttribute("preemptive-auth", basicAuth);\r
\r
- HttpResponse response = getClient().execute(mHost, query, httpContext);\r
- return response;\r
+ HttpResponse response = getClient().execute(mHost, query, httpContext);*/\r
+ return null;\r
}\r
\r
protected TreeNode fireRequest(HttpRequest query)\r
\r
TreeNode root = new TreeNode();\r
root.setProperty(TreeNode.NodeProperty.NAME, "");\r
- this.parseResponse(response, getUri(), getClient(), mHost,\r
- root.getChildList(), false, 0);\r
+ //this.parseResponse(response, getUri(), getClient(), mHost,\r
+ // root.getChildList(), false, 0);\r
return root;\r
}\r
\r
AccountAuthenticator.KEY_OC_URL));\r
}\r
\r
- private DefaultHttpClient getClient() throws OperationCanceledException,\r
+ protected WebdavClient getClient() throws OperationCanceledException,\r
AuthenticatorException, IOException {\r
if (mClient == null) {\r
String username = getAccount().name.split("@")[0];\r
mHost = mClient.getTargetHost();\r
}\r
\r
- return mClient.getHttpClient();\r
+ return mClient;\r
}\r
\r
private void parseResponse(HttpResponse resp, Uri uri,\r
import java.io.IOException;\r
\r
import org.apache.http.entity.StringEntity;\r
+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.apache.jackrabbit.webdav.property.DavProperty;\r
+import org.apache.jackrabbit.webdav.property.DavPropertyName;\r
\r
import android.accounts.Account;\r
import android.accounts.AuthenticatorException;\r
import android.os.RemoteException;\r
import android.util.Log;\r
import eu.alefzero.owncloud.datamodel.FileDataStorageManager;\r
+import eu.alefzero.owncloud.datamodel.OCFile;\r
import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;\r
import eu.alefzero.webdav.HttpPropFind;\r
import eu.alefzero.webdav.TreeNode;\r
import eu.alefzero.webdav.TreeNode.NodeProperty;\r
+import eu.alefzero.webdav.WebdavEntry;\r
import eu.alefzero.webdav.WebdavUtils;\r
\r
/**\r
public FileSyncAdapter(Context context, boolean autoInitialize) {\r
super(context, autoInitialize);\r
}\r
-\r
+ \r
@Override\r
public synchronized void onPerformSync(\r
Account account, \r
ContentProviderClient provider, \r
SyncResult syncResult) {\r
\r
- try {\r
this.setAccount(account);\r
this.setContentProvider(provider);\r
this.setStorageManager(new FileDataStorageManager(account, getContentProvider()));\r
\r
- HttpPropFind query = this.getPropFindQuery();\r
- query.setEntity(new StringEntity(WebdavUtils.prepareXmlForPropFind()));\r
- TreeNode root = this.fireRequest(query);\r
-\r
- // commitToDatabase(root, null);\r
- } catch (OperationCanceledException e) {\r
- e.printStackTrace();\r
- } catch (AuthenticatorException e) {\r
- syncResult.stats.numAuthExceptions++;\r
- e.printStackTrace();\r
- } catch (IOException e) {\r
- syncResult.stats.numIoExceptions++;\r
- e.printStackTrace();\r
- }// catch (RemoteException e) {\r
- // e.printStackTrace();\r
- // q}\r
+ fetchData(getUri().toString(), syncResult, 0);\r
}\r
\r
- private void commitToDatabase(TreeNode root, String parentId) throws RemoteException {\r
- for (TreeNode n : root.getChildList()) {\r
- Log.d(TAG, n.toString());\r
- ContentValues cv = new ContentValues();\r
- cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, n.getProperty(NodeProperty.CONTENT_LENGTH));\r
- cv.put(ProviderTableMeta.FILE_MODIFIED, n.getProperty(NodeProperty.LAST_MODIFIED_DATE));\r
- cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, n.getProperty(NodeProperty.RESOURCE_TYPE));\r
- cv.put(ProviderTableMeta.FILE_PARENT, parentId);\r
+ private void fetchData(String uri, SyncResult syncResult, long parentId) {\r
+ try {\r
+ PropFindMethod query = new PropFindMethod(uri);\r
+ getClient().executeMethod(query);\r
+ MultiStatus resp = null;\r
+ resp = query.getResponseBodyAsMultiStatus();\r
+ for (int i = (parentId==0?0:1); i < resp.getResponses().length; ++i) {\r
+ WebdavEntry we = new WebdavEntry(resp.getResponses()[i]);\r
+ OCFile file = new OCFile(we.path());\r
+ file.setCreationTimestamp(we.createTimestamp());\r
+ file.setFileLength(we.contentLength());\r
+ file.setMimetype(we.contentType());\r
+ file.setModificationTimestamp(we.modifiedTimesamp());\r
+ file.setParentId(parentId);\r
+ if (we.contentType().equals("DIR"))\r
+ fetchData(getUri().toString() + we.path(), syncResult, file.getFileId());\r
+ }\r
\r
- String name = n.getProperty(NodeProperty.NAME),\r
- path = n.getProperty(NodeProperty.PATH);\r
- Cursor c = this.getContentProvider().query(ProviderTableMeta.CONTENT_URI_FILE,\r
- null,\r
- ProviderTableMeta.FILE_NAME+"=? AND " + ProviderTableMeta.FILE_PATH + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",\r
- new String[]{name, path, this.getAccount().name},\r
- null);\r
- if (c.moveToFirst()) {\r
- this.getContentProvider().update(ProviderTableMeta.CONTENT_URI,\r
- cv,\r
- ProviderTableMeta._ID+"=?",\r
- new String[]{c.getString(c.getColumnIndex(ProviderTableMeta._ID))});\r
- Log.d(TAG, "ID of: "+name+":"+c.getString(c.getColumnIndex(ProviderTableMeta._ID)));\r
- } else {\r
- cv.put(ProviderTableMeta.FILE_NAME, n.getProperty(NodeProperty.NAME));\r
- cv.put(ProviderTableMeta.FILE_PATH, n.getProperty(NodeProperty.PATH));\r
- cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, this.getAccount().name);\r
- Uri entry = this.getContentProvider().insert(ProviderTableMeta.CONTENT_URI_FILE, cv);\r
- Log.d(TAG, "Inserting new entry " + path);\r
- c = this.getContentProvider().query(entry, null, null, null, null);\r
- c.moveToFirst();\r
- }\r
- if (n.getProperty(NodeProperty.RESOURCE_TYPE).equals("DIR")) {\r
- commitToDatabase(n, c.getString(c.getColumnIndex(ProviderTableMeta._ID)));\r
- }\r
- }\r
- // clean removed files\r
- String[] selection = new String[root.getChildList().size()+2];\r
- selection[0] = this.getAccount().name;\r
- selection[1] = parentId;\r
- String qm = "";\r
- for (int i = 2; i < selection.length-1; ++i) {\r
- qm += "?,";\r
- selection[i] = root.getChildList().get(i-2).getProperty(NodeProperty.NAME);\r
- }\r
- if (selection.length >= 3) {\r
- selection[selection.length-1] = root.getChildrenNames()[selection.length-3];\r
- qm += "?";\r
- }\r
- for (int i = 0; i < selection.length; ++i) {\r
- Log.d(TAG,selection[i]+"");\r
- }\r
- Log.d(TAG,"Removing files "+ parentId);\r
- this.getContentProvider().delete(ProviderTableMeta.CONTENT_URI,\r
- ProviderTableMeta.FILE_ACCOUNT_OWNER+"=? AND " + ProviderTableMeta.FILE_PARENT + (parentId==null?" IS ":"=")+"? AND " + ProviderTableMeta.FILE_NAME + " NOT IN ("+qm+")",\r
- selection);\r
- }\r
+ } catch (OperationCanceledException e) {\r
+ e.printStackTrace();\r
+ } catch (AuthenticatorException e) {\r
+ syncResult.stats.numAuthExceptions++;\r
+ e.printStackTrace();\r
+ } catch (IOException e) {\r
+ syncResult.stats.numIoExceptions++;\r
+ e.printStackTrace();\r
+ } catch (DavException e) {\r
+ syncResult.stats.numIoExceptions++;\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ \r
}\r
String s = "/";\r
for (String a : mDirNames)\r
s+= a + "/";\r
+ Log.e("ASD", s);\r
\r
mStorageManager = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
OCFile file = mStorageManager.getFileByPath(s);\r
import java.io.FileOutputStream;
import java.io.IOException;
+import org.apache.commons.httpclient.Credentials;\r
+import org.apache.commons.httpclient.HttpClient;\r
+import org.apache.commons.httpclient.UsernamePasswordCredentials;\r
+import org.apache.commons.httpclient.auth.AuthScope;\r
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.FileEntity;
-import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import android.net.Uri;
import android.util.Log;
-public class WebdavClient {
+public class WebdavClient extends HttpClient {
private DefaultHttpClient mHttpClient;
private BasicHttpContext mHttpContext;
private HttpHost mTargetHost;
private SchemeRegistry mSchemeRegistry;
- private Uri mUri;
+ private Uri mUri;\r
+ private Credentials mCredentials;
final private static String TAG = "WebdavClient";
public DefaultHttpClient getHttpClient() {
// determine default port for http or https
int targetPort = mTargetHost.getPort() == -1 ?
( mUri.getScheme().equals("https") ? 443 : 80)
- : mUri.getPort();
-
- mHttpClient.getCredentialsProvider().setCredentials(
- new AuthScope(mUri.getHost(), targetPort),
- new UsernamePasswordCredentials(username, password));
- BasicScheme basicAuth = new BasicScheme();
- mHttpContext.setAttribute("preemptive-auth", basicAuth);
+ : mUri.getPort();\r
+\r
+ getParams().setAuthenticationPreemptive(true);
+ getState().setCredentials(AuthScope.ANY, getCredentials(username, password));
}
+ private Credentials getCredentials(String username, String password) {\r
+ if (mCredentials == null)\r
+ mCredentials = new UsernamePasswordCredentials(username, password); \r
+ return mCredentials;\r
+ }\r
public void allowUnsignedCertificates() {
// https
mSchemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));
--- /dev/null
+package eu.alefzero.webdav;
+
+import java.util.Date;
+
+import org.apache.jackrabbit.webdav.MultiStatusResponse;
+import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+
+import android.util.Log;
+
+public class WebdavEntry {
+ private String mName, mPath, mUri, mContentType;
+ private long mContentLength, mCreateTimestamp, mModifiedTimestamp;
+
+ public WebdavEntry(MultiStatusResponse ms) {
+ resetData();
+ if (ms.getStatus().length != 0) {
+ mUri = ms.getHref();
+
+ mPath = mUri.split("webdav.php", 2)[1];
+
+ int status = ms.getStatus()[0].getStatusCode();
+ DavPropertySet propSet = ms.getProperties(status);
+ @SuppressWarnings("rawtypes")
+ DavProperty prop = propSet.get(DavPropertyName.DISPLAYNAME);
+ if (prop != null) mName = (String) prop.getName().toString();
+ else {
+ String[] tmp = mPath.split("/");
+ if (tmp.length > 0)
+ mName = tmp[tmp.length-1];
+ }
+
+ prop = propSet.get(DavPropertyName.GETCONTENTTYPE);
+ if (prop != null) {
+ mContentType = (String) prop.getValue();
+ } else {
+ mContentType = "DIR";
+ /*prop = propSet.get(DavPropertyName.ISCOLLECTION);
+ if (prop != null && Boolean.parseBoolean((String) prop.getValue()))
+ mContentType = "DIR";*/
+ }
+
+ prop = propSet.get(DavPropertyName.GETCONTENTLENGTH);
+ if (prop != null)
+ mContentLength = Long.parseLong((String) prop.getValue());
+
+ prop = propSet.get(DavPropertyName.GETLASTMODIFIED);
+ if (prop != null) {
+ Date d = WebdavUtils.parseResponseDate((String)prop.getValue());
+ mModifiedTimestamp = (d != null) ? d.getTime() : 0;
+ }
+
+ prop = propSet.get(DavPropertyName.CREATIONDATE);
+ if (prop != null) {
+ Date d = WebdavUtils.parseResponseDate((String)prop.getValue());
+ mCreateTimestamp = (d != null) ? d.getTime() : 0;
+ }
+
+ } else {
+ Log.e("WebdavEntry", "General fuckup, no status for webdav response");
+ }
+ }
+
+ public String path() {
+ return mPath;
+ }
+
+ public String name() {
+ return mName;
+ }
+
+ public boolean isDirectory() {
+ return mContentType.equals("DIR");
+ }
+
+ public String contentType() {
+ return mContentType;
+ }
+
+ public String uri() {
+ return mUri;
+ }
+
+ public long contentLength() {
+ return mContentLength;
+ }
+
+ public long createTimestamp() {
+ return mCreateTimestamp;
+ }
+
+ public long modifiedTimesamp() {
+ return mModifiedTimestamp;
+ }
+
+ private void resetData() {
+ mName = mUri = mContentType = null;
+ mContentLength = mCreateTimestamp = mModifiedTimestamp = 0;
+ }
+}
return "<?xml version=\"1.0\" ?><D:propertyupdate xmlns:D=\"DAV:\"></D:propertyupdate>";
}
- private static Date parseResponseDate(String date) {
+ public static Date parseResponseDate(String date) {
Date returnDate = null;
for (int i = 0; i < DATETIME_FORMATS.length; ++i) {
try {