X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/0174908b88cbe11d937dfdfb3ace6de0efd1aa7d..5f61cb15552eb2fda01716078a9191b88cebf764:/src/eu/alefzero/owncloud/datamodel/OCFile.java diff --git a/src/eu/alefzero/owncloud/datamodel/OCFile.java b/src/eu/alefzero/owncloud/datamodel/OCFile.java index f377a047..68619337 100644 --- a/src/eu/alefzero/owncloud/datamodel/OCFile.java +++ b/src/eu/alefzero/owncloud/datamodel/OCFile.java @@ -18,126 +18,337 @@ package eu.alefzero.owncloud.datamodel; -import java.util.Vector; - -import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta; -import android.accounts.Account; -import android.content.ContentProvider; -import android.content.ContentValues; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -public class OCFile { - private static String TAG = "OCFile"; - - private long id_; - private long length_; - private long creation_timestamp_; - private long modified_timestamp_; - private String path_; - private String storage_path_; - private String mimetype_; - - private ContentProvider cp_; - private Account account_; - - public OCFile(ContentProvider cp, Account account, long id) { - cp_ = cp; - account_ = account; - Cursor c = cp_.query(ProviderTableMeta.CONTENT_URI_FILE, - null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + - ProviderTableMeta._ID + "=?", - new String[]{account_.name, String.valueOf(id)}, - null); - setFileData(c); - } - - public OCFile(ContentProvider cp, Account account, String path) { - cp_ = cp; - account_ = account; - Cursor c = cp_.query(ProviderTableMeta.CONTENT_URI_FILE, - null, - ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + - ProviderTableMeta.FILE_PATH + "=?", - new String[]{account_.name, path}, - null); - setFileData(c); - if (path_ != null) path_ = path; - } - - public long getFileId() { return id_; } - - public String getPath() { return path_; } - - public boolean fileExtist() { return id_ != -1; } - - public boolean isDirectory() { return mimetype_ != null && mimetype_.equals("dir"); } - - public boolean isDownloaded() { return storage_path_ != null; } - - public String getStoragePath() { return storage_path_; } - public void setStoragePath(String storage_path) { storage_path_ = storage_path; } - - public long getCreationTimestamp() { return creation_timestamp_; } - public void setCreationTimestamp(long creation_timestamp) { creation_timestamp_ = creation_timestamp; } - - public long getModificationTimestamp() { return modified_timestamp_; } - public void setModificationTimestamp(long modification_timestamp) { modified_timestamp_ = modification_timestamp; } - - public void save() { - ContentValues cv = new ContentValues(); - cv.put(ProviderTableMeta.FILE_MODIFIED, modified_timestamp_); - cv.put(ProviderTableMeta.FILE_CREATION, creation_timestamp_); - cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, length_); - cv.put(ProviderTableMeta.CONTENT_TYPE, mimetype_); +import java.io.File; + +import android.os.Parcel; +import android.os.Parcelable; + +public class OCFile implements Parcelable, Comparable { + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public OCFile createFromParcel(Parcel source) { + return new OCFile(source); + } + + @Override + public OCFile[] newArray(int size) { + return new OCFile[size]; + } + }; + + private long mId; + private long mParentId; + private long mLength; + private long mCreationTimestamp; + private long mModifiedTimestamp; + private String mRemotePath; + private String mLocalPath; + private String mMimeType; + private boolean mNeedsUpdating; + private long mLastSyncDate; + + /** + * Create new {@link OCFile} with given path + * + * @param path The remote path of the file + */ + public OCFile(String path) { + resetData(); + mNeedsUpdating = false; + mRemotePath = path; + } + + /** + * Reconstruct from parcel + * + * @param source The source parcel + */ + private OCFile(Parcel source) { + mId = source.readLong(); + mParentId = source.readLong(); + mLength = source.readLong(); + mCreationTimestamp = source.readLong(); + mModifiedTimestamp = source.readLong(); + mRemotePath = source.readString(); + mLocalPath = source.readString(); + mMimeType = source.readString(); + mNeedsUpdating = source.readInt() == 0; + } + + /** + * Gets the ID of the file + * + * @return the file ID + */ + public long getFileId() { + return mId; + } + + /** + * Returns the remote path of the file on ownCloud + * + * @return The remote path to the file + */ + public String getRemotePath() { + return mRemotePath; + } + + /** + * Can be used to check, whether or not this file exists in the database + * already + * + * @return true, if the file exists in the database + */ + public boolean fileExists() { + return mId != -1; + } + + /** + * Use this to find out if this file is a Directory + * + * @return true if it is a directory + */ + public boolean isDirectory() { + return mMimeType != null && mMimeType.equals("DIR"); + } + + /** + * Use this to check if this file is available locally + * + * @return true if it is + */ + public boolean isDownloaded() { + return mLocalPath != null && !mLocalPath.equals(""); + } + + /** + * The path, where the file is stored locally + * + * @return The local path to the file + */ + public String getStoragePath() { + return mLocalPath; + } + + /** + * Can be used to set the path where the file is stored + * + * @param storage_path to set + */ + public void setStoragePath(String storage_path) { + mLocalPath = storage_path; + } + + /** + * Get a UNIX timestamp of the file creation time + * + * @return A UNIX timestamp of the time that file was created + */ + public long getCreationTimestamp() { + return mCreationTimestamp; + } + + /** + * Set a UNIX timestamp of the time the file was created + * + * @param creation_timestamp to set + */ + public void setCreationTimestamp(long creation_timestamp) { + mCreationTimestamp = creation_timestamp; + } + + /** + * Get a UNIX timestamp of the file modification time + * + * @return A UNIX timestamp of the modification time + */ + public long getModificationTimestamp() { + return mModifiedTimestamp; + } + + /** + * Set a UNIX timestamp of the time the time the file was modified. + * + * @param modification_timestamp to set + */ + public void setModificationTimestamp(long modification_timestamp) { + mModifiedTimestamp = modification_timestamp; + } + + /** + * Returns the filename and "/" for the root directory + * + * @return The name of the file + */ + public String getFileName() { + if (mRemotePath != null) { + File f = new File(mRemotePath); + return f.getName().equals("") ? "/" : f.getName(); + } + return null; + } + + /** + * Can be used to get the Mimetype + * + * @return the Mimetype as a String + */ + public String getMimetype() { + return mMimeType; + } + + /** + * Adds a file to this directory. If this file is not a directory, an + * exception gets thrown. + * + * @param file to add + * @throws IllegalStateException if you try to add a something and this is + * not a directory + */ + public void addFile(OCFile file) throws IllegalStateException { + if (isDirectory()) { + file.mParentId = mId; + mNeedsUpdating = true; + return; + } + throw new IllegalStateException( + "This is not a directory where you can add stuff to!"); + } + + /** + * Used internally. Reset all file properties + */ + private void resetData() { + mId = -1; + mRemotePath = null; + mParentId = 0; + mLocalPath = null; + mMimeType = null; + mLength = 0; + mCreationTimestamp = 0; + mModifiedTimestamp = 0; + mLastSyncDate = 0; + } + + /** + * Sets the ID of the file + * + * @param file_id to set + */ + public void setFileId(long file_id) { + mId = file_id; + } + + /** + * Sets the Mime-Type of the + * + * @param mimetype to set + */ + public void setMimetype(String mimetype) { + mMimeType = mimetype; + } + + /** + * Sets the ID of the parent folder + * + * @param parent_id to set + */ + public void setParentId(long parent_id) { + mParentId = parent_id; + } + + /** + * Sets the file size in bytes + * + * @param file_len to set + */ + public void setFileLength(long file_len) { + mLength = file_len; + } + + /** + * Returns the size of the file in bytes + * + * @return The filesize in bytes + */ + public long getFileLength() { + return mLength; + } + + /** + * Returns the ID of the parent Folder + * + * @return The ID + */ + public long getParentId() { + return mParentId; + } + + /** + * Check, if this file needs updating + * + * @return + */ + public boolean needsUpdatingWhileSaving() { + return mNeedsUpdating; + } + + public long getLastSyncDate() { + return mLastSyncDate; + } - Uri new_entry = cp_.insert(ProviderTableMeta.CONTENT_URI, cv); - try { - id_ = Integer.parseInt(new_entry.getEncodedPath()); - } catch (NumberFormatException e) { - Log.e(TAG, "Can't retrieve file id from uri: " + new_entry.toString() + - ", reason: " + e.getMessage()); - id_ = -1; - } - } - - public Vector getDirectoryContent() { - if (isDirectory() && id_ != -1) { - Vector ret = new Vector(); - - Uri req_uri = Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, String.valueOf(id_)); - Cursor c = cp_.query(req_uri, null, null, null, null); - - if (c.moveToFirst()) - do { - long id = c.getLong(c.getColumnIndex(ProviderTableMeta._ID)); - OCFile child = new OCFile(cp_, account_, id); - ret.add(child); - } while (c.moveToNext()); - - return ret; - } - return null; - } - - private void setFileData(Cursor c) { - id_ = -1; - path_ = null; - storage_path_ = null; - mimetype_ = null; - length_ = 0; - creation_timestamp_ = 0; - modified_timestamp_ = 0; - if (c != null && c.moveToFirst()) { - id_ = c.getLong(c.getColumnIndex(ProviderTableMeta._ID)); - path_ = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_PATH)); - storage_path_ = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_STORAGE_PATH)); - mimetype_ = c.getString(c.getColumnIndex(ProviderTableMeta.FILE_CONTENT_TYPE)); - length_ = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_CONTENT_LENGTH)); - creation_timestamp_ = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_CREATION)); - modified_timestamp_ = c.getLong(c.getColumnIndex(ProviderTableMeta.FILE_MODIFIED)); - } - } + public void setLastSyncDate(long lastSyncDate) { + mLastSyncDate = lastSyncDate; + } + + @Override + public int describeContents() { + return this.hashCode(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(mId); + dest.writeLong(mParentId); + dest.writeLong(mLength); + dest.writeLong(mCreationTimestamp); + dest.writeLong(mModifiedTimestamp); + dest.writeString(mRemotePath); + dest.writeString(mLocalPath); + dest.writeString(mMimeType); + dest.writeInt(mNeedsUpdating ? 1 : 0); + dest.writeLong(mLastSyncDate); + } + + @Override + public int compareTo(OCFile another) { + if (isDirectory() && another.isDirectory()) { + return getFileName().toLowerCase().compareTo(another.getFileName().toLowerCase()); + } else if (isDirectory()) { + return -1; + } else if (another.isDirectory()) { + return 1; + } + return getFileName().toLowerCase().compareTo(another.getFileName().toLowerCase()); + } + + public boolean equals(Object o) { + if(o instanceof OCFile){ + OCFile that = (OCFile) o; + if(that != null){ + return this.mId == that.mId; + } + } + + return false; + } + + @Override + public String toString() { + String asString = "[id=%s, name=%s, mime=%s, downloaded=%s, local=%s, remote=%s]"; + asString = String.format(asString, new Long(mId), getFileName(), mMimeType, isDownloaded(), mLocalPath, mRemotePath); + return asString; + } + }