1 /**********************************************
2 * Copyright (C) 2011 Lukas laag
3 * This file is part of lib-gwt-file.
4 *
5 * lib-gwt-file is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * lib-gwt-file is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with lib-gwt-file. If not, see http://www.gnu.org/licenses/
17 **********************************************/
18 /**
19 * Documentation is adapted from W3C spec and content available from
20 * http://developer.mozilla.org under http://creativecommons.org/licenses/by-sa/2.5/
21 */
22 package org.vectomatic.file;
23
24 import org.vectomatic.file.impl.SliceImpl;
25
26 import com.google.gwt.core.client.GWT;
27 import com.google.gwt.core.client.JavaScriptObject;
28
29 /**
30 * A Blob object represents a file-like object of raw data. It's used to
31 * represent data that isn't necessarily in a JavaScript-native format. The
32 * {@link org.vectomatic.file.File} interface is based on it, inheriting the
33 * Blob's functionality and expanding it to support files on the user's system.
34 */
35 public class Blob extends JavaScriptObject {
36 private static SliceImpl sliceImpl;
37 /**
38 * Temporary fix because the File API slice methods are currently prefixed.
39 * @return An implementation of the slice methods
40 */
41 private static final SliceImpl getSliceImpl() {
42 if (sliceImpl == null) {
43 sliceImpl = GWT.create(SliceImpl.class);
44 }
45 return sliceImpl;
46 }
47
48 protected Blob() {
49 }
50
51 /**
52 * The size, in bytes, of the data contained in the Blob object.
53 *
54 * @return The size, in bytes, of the data contained in the Blob object.
55 */
56 public final long getSize() {
57 String size = getSize_();
58 return Long.parseLong(size);
59 }
60
61 private final native String getSize_() /*-{
62 return "" + this.size;
63 }-*/;
64
65
66 /**
67 * An ASCII-encoded string, in all lower case, indicating the MIME type of
68 * the data contained in the Blob. If the type is unknown, this string is
69 * empty.
70 *
71 * @return The MIME type of the data contained in the Blob
72 */
73 public final native String getType() /*-{
74 return this.type;
75 }-*/;
76
77 /**
78 * Returns a new Blob object containing a full copy of the data in the
79 * source Blob.
80 *
81 * @return The new Blob object
82 */
83 public final Blob slice() {
84 return getSliceImpl().slice(this);
85 }
86
87 /**
88 * Returns a new Blob object containing the data in the specified range of
89 * bytes of the source Blob.
90 *
91 * @param start
92 * An index into the Blob indicating the first byte to copy into
93 * the new Blob. If you specify a negative value, it's treated as
94 * an offset from the end of the string toward the beginning (for
95 * example, -10 would be the 10th from last byte in the Blob).
96 * @return The new Blob object
97 */
98 public final Blob slice(long start) {
99 return getSliceImpl().slice(this, start);
100 }
101
102 /**
103 * Returns a new Blob object containing the data in the specified range of
104 * bytes of the source Blob.
105 *
106 * @param start
107 * An index into the Blob indicating the first byte to copy into
108 * the new Blob. If you specify a negative value, it's treated as
109 * an offset from the end of the string toward the beginning (for
110 * example, -10 would be the 10th from last byte in the Blob).
111 * @param end
112 * An index into the Blob indicating the last byte to copy into
113 * the new Blob. If you specify a negative value, it's treated as
114 * an offset from the end of the string toward the beginning (for
115 * example, -10 would be the 10th from last byte in the Blob).
116 * @return The new Blob object
117 */
118 public final Blob slice(long start, long end) {
119 return getSliceImpl().slice(this, start, end);
120 }
121
122 /**
123 * Returns a new Blob object containing the data in the specified range of
124 * bytes of the source Blob.
125 *
126 * @param start
127 * An index into the Blob indicating the first byte to copy into
128 * the new Blob. If you specify a negative value, it's treated as
129 * an offset from the end of the string toward the beginning (for
130 * example, -10 would be the 10th from last byte in the Blob).
131 * @param end
132 * An index into the Blob indicating the last byte to copy into
133 * the new Blob. If you specify a negative value, it's treated as
134 * an offset from the end of the string toward the beginning (for
135 * example, -10 would be the 10th from last byte in the Blob).
136 * @param contentType
137 * The content type to assign to the new Blob; this will be the
138 * value of its type property.
139 * @return The new Blob object
140 */
141 public final Blob slice(long start, long end, String contentType) {
142 return getSliceImpl().slice(this, start, end, contentType);
143 }
144
145 /**
146 * @deprecated Replaced by {@link FileUtils#createObjectURL(org.vectomatic.file.Blob)}
147 */
148 @Deprecated
149 public final native String createObjectURL() /*-{
150 return $wnd.URL.createObjectURL(this);
151 }-*/;
152
153 /**
154 * @deprecated Replaced by {@link FileUtils#revokeObjectURL(java.lang.String)}
155 */
156 @Deprecated
157 public final native void revokeObjectURL(String url) /*-{
158 $wnd.URL.revokeObjectURL(url);
159 }-*/;
160 }