Fixed that small todo: Set KeepAlive based on the response code
[pub/Android/ownCloud.git] / src / eu / alefzero / owncloud / syncadapter / AbstractOwnCloudSyncAdapter.java
index e4bacf2..73e41d2 100644 (file)
@@ -43,15 +43,16 @@ import android.content.Context;
 import android.net.Uri;\r
 import android.text.TextUtils;\r
 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
 import android.net.Uri;\r
 import android.text.TextUtils;\r
 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
+import eu.alefzero.owncloud.datamodel.OCFile;\r
 import eu.alefzero.webdav.HttpPropFind;\r
 import eu.alefzero.webdav.TreeNode;\r
 import eu.alefzero.webdav.HttpPropFind;\r
 import eu.alefzero.webdav.TreeNode;\r
+import eu.alefzero.webdav.TreeNode.NodeProperty;\r
 import eu.alefzero.webdav.WebdavClient;\r
 import eu.alefzero.webdav.WebdavUtils;\r
 import eu.alefzero.webdav.WebdavClient;\r
 import eu.alefzero.webdav.WebdavUtils;\r
-import eu.alefzero.webdav.TreeNode.NodeProperty;\r
 
 /**
  * Base SyncAdapter for OwnCloud
 
 /**
  * Base SyncAdapter for OwnCloud
- * Designed to be subclassed for the concreete SyncAdapter, like ConcatsSync, CalendarSync, FileSync etc..
+ * Designed to be subclassed for the concrete SyncAdapter, like ConcatsSync, CalendarSync, FileSync etc..
  * 
  * @author sassman
  *
  * 
  * @author sassman
  *
@@ -106,9 +107,19 @@ public abstract class AbstractOwnCloudSyncAdapter extends AbstractThreadedSyncAd
        protected ConnectionKeepAliveStrategy getKeepAliveStrategy() {
                return new ConnectionKeepAliveStrategy() {
                        public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
        protected ConnectionKeepAliveStrategy getKeepAliveStrategy() {
                return new ConnectionKeepAliveStrategy() {
                        public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
-                               // TODO: change keep alive straategy basing on response: ie forbidden/not found/etc
+                               // Change keep alive straategy basing on response: ie forbidden/not found/etc
                                // should have keep alive 0
                                // should have keep alive 0
-                               // default return: 5s
+                               // default return: 5s\r
+                               int statusCode = response.getStatusLine().getStatusCode();\r
+                               \r
+                               // HTTP 400, 500 Errors as well as HTTP 118 - Connection timed out\r
+                               if((statusCode >= 400 && statusCode <= 418) || \r
+                                               (statusCode >= 421 && statusCode <= 426) ||\r
+                                               (statusCode >= 500 && statusCode <= 510 ) ||\r
+                                               statusCode == 118) {\r
+                                       return 0;\r
+                               }\r
+                               
                                return 5 * 1000;
                        }
                };
                                return 5 * 1000;
                        }
                };
@@ -134,8 +145,8 @@ public abstract class AbstractOwnCloudSyncAdapter extends AbstractThreadedSyncAd
                HttpResponse response = fireRawRequest(query);
                
                TreeNode root = new TreeNode();
                HttpResponse response = fireRawRequest(query);
                
                TreeNode root = new TreeNode();
-               root.setProperty(TreeNode.NodeProperty.NAME, "/");
-               this.parseResponse(response, getUri(), getClient(), mHost, root.getChildList());
+               root.setProperty(TreeNode.NodeProperty.NAME, "");
+               this.parseResponse(response, getUri(), getClient(), mHost, root.getChildList(), false, 0);
                return root;
        }
        
                return root;
        }
        
@@ -161,22 +172,34 @@ public abstract class AbstractOwnCloudSyncAdapter extends AbstractThreadedSyncAd
                return mClient.getHttpClient();
        }
        
                return mClient.getHttpClient();
        }
        
-       private void parseResponse(HttpResponse resp, Uri uri, DefaultHttpClient client, HttpHost targetHost, LinkedList<TreeNode> insertList) throws IOException, OperationCanceledException, AuthenticatorException {
-               boolean skipFirst = true;
-               for (TreeNode n :WebdavUtils.parseResponseToNodes(resp.getEntity().getContent())) {
-                       String path = n.stripPathFromFilename(uri.getPath());
-                       if (skipFirst) {
-                               skipFirst = false;
-                               continue;
+       private void parseResponse(HttpResponse resp, Uri uri, DefaultHttpClient client, HttpHost targetHost, LinkedList<TreeNode> insertList, boolean sf, long parent_id) throws IOException, OperationCanceledException, AuthenticatorException {
+               boolean skipFirst = sf, override_parent = !sf;
+               for (TreeNode n :WebdavUtils.parseResponseToNodes(resp.getEntity().getContent())) {\r
+                 if (skipFirst) {\r
+        skipFirst = false;\r
+        continue;\r
+      }
+                       String path = n.stripPathFromFilename(uri.getPath());\r
+                       OCFile new_file = OCFile.createNewFile(getContentProvider(),\r
+          getAccount(),\r
+          n.getProperty(NodeProperty.PATH),\r
+          0,//Long.parseLong(n.getProperty(NodeProperty.CONTENT_LENGTH)),\r
+          0,//Long.parseLong(n.getProperty(NodeProperty.CREATE_DATE)),\r
+          0,//Long.parseLong(n.getProperty(NodeProperty.LAST_MODIFIED_DATE)),\r
+          n.getProperty(NodeProperty.RESOURCE_TYPE),\r
+          parent_id);\r
+                       new_file.save();\r
+                       if (override_parent) {\r
+                         parent_id = new_file.getFileId();\r
+                         override_parent = false;\r
                        }
                        }
-                       insertList.add(n);
 
                        if (!TextUtils.isEmpty(n.getProperty(NodeProperty.NAME)) &&
                                        n.getProperty(NodeProperty.RESOURCE_TYPE).equals("DIR")) {
                            
                            HttpPropFind method = new HttpPropFind(uri.getPath() + path + n.getProperty(NodeProperty.NAME).replace(" ", "%20") + "/");
                                HttpResponse response = fireRawRequest(method);
 
                        if (!TextUtils.isEmpty(n.getProperty(NodeProperty.NAME)) &&
                                        n.getProperty(NodeProperty.RESOURCE_TYPE).equals("DIR")) {
                            
                            HttpPropFind method = new HttpPropFind(uri.getPath() + path + n.getProperty(NodeProperty.NAME).replace(" ", "%20") + "/");
                                HttpResponse response = fireRawRequest(method);
-                               parseResponse(response, uri, client, targetHost, n.getChildList());
+                               parseResponse(response, uri, client, targetHost, n.getChildList(), true, new_file.getFileId());
                        }
                }
        }
                        }
                }
        }