1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 
3 /* nemo-file-undo-operations.h - Manages undo/redo of file operations
4  *
5  * Copyright (C) 2007-2011 Amos Brocco
6  * Copyright (C) 2010 Red Hat, Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 51 Franklin Street - Suite 500,
21  * Boston, MA 02110-1335, USA.
22  *
23  * Authors: Amos Brocco <amos.brocco@gmail.com>
24  *          Cosimo Cecchi <cosimoc@redhat.com>
25  *
26  */
27 
28 #ifndef __NEMO_FILE_UNDO_OPERATIONS_H__
29 #define __NEMO_FILE_UNDO_OPERATIONS_H__
30 
31 #include <gio/gio.h>
32 #include <gtk/gtk.h>
33 
34 typedef enum {
35 	NEMO_FILE_UNDO_OP_COPY,
36 	NEMO_FILE_UNDO_OP_DUPLICATE,
37 	NEMO_FILE_UNDO_OP_MOVE,
38 	NEMO_FILE_UNDO_OP_RENAME,
39 	NEMO_FILE_UNDO_OP_CREATE_EMPTY_FILE,
40 	NEMO_FILE_UNDO_OP_CREATE_FILE_FROM_TEMPLATE,
41 	NEMO_FILE_UNDO_OP_CREATE_FOLDER,
42 	NEMO_FILE_UNDO_OP_MOVE_TO_TRASH,
43 	NEMO_FILE_UNDO_OP_RESTORE_FROM_TRASH,
44 	NEMO_FILE_UNDO_OP_CREATE_LINK,
45 	NEMO_FILE_UNDO_OP_RECURSIVE_SET_PERMISSIONS,
46 	NEMO_FILE_UNDO_OP_SET_PERMISSIONS,
47 	NEMO_FILE_UNDO_OP_CHANGE_GROUP,
48 	NEMO_FILE_UNDO_OP_CHANGE_OWNER,
49 	NEMO_FILE_UNDO_OP_NUM_TYPES,
50 } NemoFileUndoOp;
51 
52 #define NEMO_TYPE_FILE_UNDO_INFO         (nemo_file_undo_info_get_type ())
53 #define NEMO_FILE_UNDO_INFO(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO, NemoFileUndoInfo))
54 #define NEMO_FILE_UNDO_INFO_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO, NemoFileUndoInfoClass))
55 #define NEMO_IS_FILE_UNDO_INFO(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO))
56 #define NEMO_IS_FILE_UNDO_INFO_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO))
57 #define NEMO_FILE_UNDO_INFO_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO, NemoFileUndoInfoClass))
58 
59 typedef struct _NemoFileUndoInfo      NemoFileUndoInfo;
60 typedef struct _NemoFileUndoInfoClass NemoFileUndoInfoClass;
61 typedef struct _NemoFileUndoInfoDetails NemoFileUndoInfoDetails;
62 
63 struct _NemoFileUndoInfo {
64 	GObject parent;
65 	NemoFileUndoInfoDetails *priv;
66 };
67 
68 struct _NemoFileUndoInfoClass {
69 	GObjectClass parent_class;
70 
71 	void (* undo_func) (NemoFileUndoInfo *self,
72 			    GtkWindow            *parent_window);
73 	void (* redo_func) (NemoFileUndoInfo *self,
74 			    GtkWindow            *parent_window);
75 
76 	void (* strings_func) (NemoFileUndoInfo *self,
77 			       gchar **undo_label,
78 			       gchar **undo_description,
79 			       gchar **redo_label,
80 			       gchar **redo_description);
81 };
82 
83 GType nemo_file_undo_info_get_type (void) G_GNUC_CONST;
84 
85 void nemo_file_undo_info_apply_async (NemoFileUndoInfo *self,
86 					  gboolean undo,
87 					  GtkWindow *parent_window,
88 					  GAsyncReadyCallback callback,
89 					  gpointer user_data);
90 gboolean nemo_file_undo_info_apply_finish (NemoFileUndoInfo *self,
91 					       GAsyncResult *res,
92 					       gboolean *user_cancel,
93 					       GError **error);
94 
95 void nemo_file_undo_info_get_strings (NemoFileUndoInfo *self,
96 					  gchar **undo_label,
97 					  gchar **undo_description,
98 					  gchar **redo_label,
99 					  gchar **redo_description);
100 
101 /* copy/move/duplicate/link/restore from trash */
102 #define NEMO_TYPE_FILE_UNDO_INFO_EXT         (nemo_file_undo_info_ext_get_type ())
103 #define NEMO_FILE_UNDO_INFO_EXT(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO_EXT, NemoFileUndoInfoExt))
104 #define NEMO_FILE_UNDO_INFO_EXT_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO_EXT, NemoFileUndoInfoExtClass))
105 #define NEMO_IS_FILE_UNDO_INFO_EXT(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO_EXT))
106 #define NEMO_IS_FILE_UNDO_INFO_EXT_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO_EXT))
107 #define NEMO_FILE_UNDO_INFO_EXT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO_EXT, NemoFileUndoInfoExtClass))
108 
109 typedef struct _NemoFileUndoInfoExt      NemoFileUndoInfoExt;
110 typedef struct _NemoFileUndoInfoExtClass NemoFileUndoInfoExtClass;
111 typedef struct _NemoFileUndoInfoExtDetails NemoFileUndoInfoExtDetails;
112 
113 struct _NemoFileUndoInfoExt {
114 	NemoFileUndoInfo parent;
115 	NemoFileUndoInfoExtDetails *priv;
116 };
117 
118 struct _NemoFileUndoInfoExtClass {
119 	NemoFileUndoInfoClass parent_class;
120 };
121 
122 GType nemo_file_undo_info_ext_get_type (void) G_GNUC_CONST;
123 NemoFileUndoInfo *nemo_file_undo_info_ext_new (NemoFileUndoOp op_type,
124 						       gint item_count,
125 						       GFile *src_dir,
126 						       GFile *target_dir);
127 void nemo_file_undo_info_ext_add_origin_target_pair (NemoFileUndoInfoExt *self,
128 							 GFile                   *origin,
129 							 GFile                   *target);
130 
131 /* create new file/folder */
132 #define NEMO_TYPE_FILE_UNDO_INFO_CREATE         (nemo_file_undo_info_create_get_type ())
133 #define NEMO_FILE_UNDO_INFO_CREATE(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO_CREATE, NemoFileUndoInfoCreate))
134 #define NEMO_FILE_UNDO_INFO_CREATE_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO_CREATE, NemoFileUndoInfoCreateClass))
135 #define NEMO_IS_FILE_UNDO_INFO_CREATE(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO_CREATE))
136 #define NEMO_IS_FILE_UNDO_INFO_CREATE_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO_CREATE))
137 #define NEMO_FILE_UNDO_INFO_CREATE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO_CREATE, NemoFileUndoInfoCreateClass))
138 
139 typedef struct _NemoFileUndoInfoCreate      NemoFileUndoInfoCreate;
140 typedef struct _NemoFileUndoInfoCreateClass NemoFileUndoInfoCreateClass;
141 typedef struct _NemoFileUndoInfoCreateDetails NemoFileUndoInfoCreateDetails;
142 
143 struct _NemoFileUndoInfoCreate {
144 	NemoFileUndoInfo parent;
145 	NemoFileUndoInfoCreateDetails *priv;
146 };
147 
148 struct _NemoFileUndoInfoCreateClass {
149 	NemoFileUndoInfoClass parent_class;
150 };
151 
152 GType nemo_file_undo_info_create_get_type (void) G_GNUC_CONST;
153 NemoFileUndoInfo *nemo_file_undo_info_create_new (NemoFileUndoOp op_type);
154 void nemo_file_undo_info_create_set_data (NemoFileUndoInfoCreate *self,
155 					      GFile                      *file,
156 					      const char                 *template,
157 					      gint                        length);
158 
159 /* rename */
160 #define NEMO_TYPE_FILE_UNDO_INFO_RENAME         (nemo_file_undo_info_rename_get_type ())
161 #define NEMO_FILE_UNDO_INFO_RENAME(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO_RENAME, NemoFileUndoInfoRename))
162 #define NEMO_FILE_UNDO_INFO_RENAME_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO_RENAME, NemoFileUndoInfoRenameClass))
163 #define NEMO_IS_FILE_UNDO_INFO_RENAME(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO_RENAME))
164 #define NEMO_IS_FILE_UNDO_INFO_RENAME_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO_RENAME))
165 #define NEMO_FILE_UNDO_INFO_RENAME_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO_RENAME, NemoFileUndoInfoRenameClass))
166 
167 typedef struct _NemoFileUndoInfoRename      NemoFileUndoInfoRename;
168 typedef struct _NemoFileUndoInfoRenameClass NemoFileUndoInfoRenameClass;
169 typedef struct _NemoFileUndoInfoRenameDetails NemoFileUndoInfoRenameDetails;
170 
171 struct _NemoFileUndoInfoRename {
172 	NemoFileUndoInfo parent;
173 	NemoFileUndoInfoRenameDetails *priv;
174 };
175 
176 struct _NemoFileUndoInfoRenameClass {
177 	NemoFileUndoInfoClass parent_class;
178 };
179 
180 GType nemo_file_undo_info_rename_get_type (void) G_GNUC_CONST;
181 NemoFileUndoInfo *nemo_file_undo_info_rename_new (void);
182 void nemo_file_undo_info_rename_set_data_pre (NemoFileUndoInfoRename *self,
183 						  GFile                      *old_file,
184 						  gchar                      *old_display_name,
185 						  gchar                      *new_display_name);
186 void nemo_file_undo_info_rename_set_data_post (NemoFileUndoInfoRename *self,
187 						   GFile                      *new_file);
188 
189 /* trash */
190 #define NEMO_TYPE_FILE_UNDO_INFO_TRASH         (nemo_file_undo_info_trash_get_type ())
191 #define NEMO_FILE_UNDO_INFO_TRASH(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO_TRASH, NemoFileUndoInfoTrash))
192 #define NEMO_FILE_UNDO_INFO_TRASH_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO_TRASH, NemoFileUndoInfoTrashClass))
193 #define NEMO_IS_FILE_UNDO_INFO_TRASH(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO_TRASH))
194 #define NEMO_IS_FILE_UNDO_INFO_TRASH_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO_TRASH))
195 #define NEMO_FILE_UNDO_INFO_TRASH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO_TRASH, NemoFileUndoInfoTrashClass))
196 
197 typedef struct _NemoFileUndoInfoTrash      NemoFileUndoInfoTrash;
198 typedef struct _NemoFileUndoInfoTrashClass NemoFileUndoInfoTrashClass;
199 typedef struct _NemoFileUndoInfoTrashDetails NemoFileUndoInfoTrashDetails;
200 
201 struct _NemoFileUndoInfoTrash {
202 	NemoFileUndoInfo parent;
203 	NemoFileUndoInfoTrashDetails *priv;
204 };
205 
206 struct _NemoFileUndoInfoTrashClass {
207 	NemoFileUndoInfoClass parent_class;
208 };
209 
210 GType nemo_file_undo_info_trash_get_type (void) G_GNUC_CONST;
211 NemoFileUndoInfo *nemo_file_undo_info_trash_new (gint item_count);
212 void nemo_file_undo_info_trash_add_file (NemoFileUndoInfoTrash *self,
213 					     GFile                     *file);
214 
215 /* recursive permissions */
216 #define NEMO_TYPE_FILE_UNDO_INFO_REC_PERMISSIONS         (nemo_file_undo_info_rec_permissions_get_type ())
217 #define NEMO_FILE_UNDO_INFO_REC_PERMISSIONS(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO_REC_PERMISSIONS, NemoFileUndoInfoRecPermissions))
218 #define NEMO_FILE_UNDO_INFO_REC_PERMISSIONS_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO_REC_PERMISSIONS, NemoFileUndoInfoRecPermissionsClass))
219 #define NEMO_IS_FILE_UNDO_INFO_REC_PERMISSIONS(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO_REC_PERMISSIONS))
220 #define NEMO_IS_FILE_UNDO_INFO_REC_PERMISSIONS_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO_REC_PERMISSIONS))
221 #define NEMO_FILE_UNDO_INFO_REC_PERMISSIONS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO_REC_PERMISSIONS, NemoFileUndoInfoRecPermissionsClass))
222 
223 typedef struct _NemoFileUndoInfoRecPermissions      NemoFileUndoInfoRecPermissions;
224 typedef struct _NemoFileUndoInfoRecPermissionsClass NemoFileUndoInfoRecPermissionsClass;
225 typedef struct _NemoFileUndoInfoRecPermissionsDetails NemoFileUndoInfoRecPermissionsDetails;
226 
227 struct _NemoFileUndoInfoRecPermissions {
228 	NemoFileUndoInfo parent;
229 	NemoFileUndoInfoRecPermissionsDetails *priv;
230 };
231 
232 struct _NemoFileUndoInfoRecPermissionsClass {
233 	NemoFileUndoInfoClass parent_class;
234 };
235 
236 GType nemo_file_undo_info_rec_permissions_get_type (void) G_GNUC_CONST;
237 NemoFileUndoInfo *nemo_file_undo_info_rec_permissions_new (GFile   *dest,
238 								   guint32 file_permissions,
239 								   guint32 file_mask,
240 								   guint32 dir_permissions,
241 								   guint32 dir_mask);
242 void nemo_file_undo_info_rec_permissions_add_file (NemoFileUndoInfoRecPermissions *self,
243 						       GFile                              *file,
244 						       guint32                             permission);
245 
246 /* single file change permissions */
247 #define NEMO_TYPE_FILE_UNDO_INFO_PERMISSIONS         (nemo_file_undo_info_permissions_get_type ())
248 #define NEMO_FILE_UNDO_INFO_PERMISSIONS(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO_PERMISSIONS, NemoFileUndoInfoPermissions))
249 #define NEMO_FILE_UNDO_INFO_PERMISSIONS_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO_PERMISSIONS, NemoFileUndoInfoPermissionsClass))
250 #define NEMO_IS_FILE_UNDO_INFO_PERMISSIONS(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO_PERMISSIONS))
251 #define NEMO_IS_FILE_UNDO_INFO_PERMISSIONS_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO_PERMISSIONS))
252 #define NEMO_FILE_UNDO_INFO_PERMISSIONS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO_PERMISSIONS, NemoFileUndoInfoPermissionsClass))
253 
254 typedef struct _NemoFileUndoInfoPermissions      NemoFileUndoInfoPermissions;
255 typedef struct _NemoFileUndoInfoPermissionsClass NemoFileUndoInfoPermissionsClass;
256 typedef struct _NemoFileUndoInfoPermissionsDetails NemoFileUndoInfoPermissionsDetails;
257 
258 struct _NemoFileUndoInfoPermissions {
259 	NemoFileUndoInfo parent;
260 	NemoFileUndoInfoPermissionsDetails *priv;
261 };
262 
263 struct _NemoFileUndoInfoPermissionsClass {
264 	NemoFileUndoInfoClass parent_class;
265 };
266 
267 GType nemo_file_undo_info_permissions_get_type (void) G_GNUC_CONST;
268 NemoFileUndoInfo *nemo_file_undo_info_permissions_new (GFile   *file,
269 							       guint32  current_permissions,
270 							       guint32  new_permissions);
271 
272 /* group and owner change */
273 #define NEMO_TYPE_FILE_UNDO_INFO_OWNERSHIP         (nemo_file_undo_info_ownership_get_type ())
274 #define NEMO_FILE_UNDO_INFO_OWNERSHIP(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NEMO_TYPE_FILE_UNDO_INFO_OWNERSHIP, NemoFileUndoInfoOwnership))
275 #define NEMO_FILE_UNDO_INFO_OWNERSHIP_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NEMO_TYPE_FILE_UNDO_INFO_OWNERSHIP, NemoFileUndoInfoOwnershipClass))
276 #define NEMO_IS_FILE_UNDO_INFO_OWNERSHIP(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NEMO_TYPE_FILE_UNDO_INFO_OWNERSHIP))
277 #define NEMO_IS_FILE_UNDO_INFO_OWNERSHIP_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NEMO_TYPE_FILE_UNDO_INFO_OWNERSHIP))
278 #define NEMO_FILE_UNDO_INFO_OWNERSHIP_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NEMO_TYPE_FILE_UNDO_INFO_OWNERSHIP, NemoFileUndoInfoOwnershipClass))
279 
280 typedef struct _NemoFileUndoInfoOwnership      NemoFileUndoInfoOwnership;
281 typedef struct _NemoFileUndoInfoOwnershipClass NemoFileUndoInfoOwnershipClass;
282 typedef struct _NemoFileUndoInfoOwnershipDetails NemoFileUndoInfoOwnershipDetails;
283 
284 struct _NemoFileUndoInfoOwnership {
285 	NemoFileUndoInfo parent;
286 	NemoFileUndoInfoOwnershipDetails *priv;
287 };
288 
289 struct _NemoFileUndoInfoOwnershipClass {
290 	NemoFileUndoInfoClass parent_class;
291 };
292 
293 GType nemo_file_undo_info_ownership_get_type (void) G_GNUC_CONST;
294 NemoFileUndoInfo *nemo_file_undo_info_ownership_new (NemoFileUndoOp  op_type,
295 							     GFile              *file,
296 							     const char         *current_data,
297 							     const char         *new_data);
298 
299 #endif /* __NEMO_FILE_UNDO_OPERATIONS_H__ */
300