Clarify docs for g_memory_output_stream_get_size. Add
[platform/upstream/glib.git] / gio / gmountoperation.c
1 /* GIO - GLib Input, Output and Streaming Library
2  * 
3  * Copyright (C) 2006-2007 Red Hat, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library 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 GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General
16  * Public License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18  * Boston, MA 02111-1307, USA.
19  *
20  * Author: Alexander Larsson <alexl@redhat.com>
21  */
22
23 #include <config.h>
24
25 #include <string.h>
26
27 #include "gmountoperation.h"
28 #include "gioenumtypes.h"
29 #include "gio-marshal.h"
30 #include "glibintl.h"
31
32 #include "gioalias.h"
33
34 /** 
35  * SECTION:gmountoperation
36  * @short_description: Authentication methods for mountable locations
37  * @include: gio/gio.h
38  *
39  * #GMountOperation provides a mechanism for authenticating mountable 
40  * operations, such as loop mounting files, hard drive partitions or 
41  * server locations. 
42  *
43  * Mounting operations are handed a #GMountOperation that then can use 
44  * if they require any privileges or authentication for their volumes 
45  * to be mounted (e.g. a hard disk partition or an encrypted filesystem), 
46  * or if they are implementing a remote server protocol which requires 
47  * user credentials such as FTP or WebDAV.
48  *
49  * Users should instantiate a subclass of this that implements all
50  * the various callbacks to show the required dialogs, such as 
51  * #GtkMountOperation.
52  **/
53
54 G_DEFINE_TYPE (GMountOperation, g_mount_operation, G_TYPE_OBJECT);
55
56 enum {
57   ASK_PASSWORD,
58   ASK_QUESTION,
59   REPLY,
60   LAST_SIGNAL
61 };
62
63 static guint signals[LAST_SIGNAL] = { 0 };
64
65 struct _GMountOperationPrivate {
66   char *password;
67   char *user;
68   char *domain;
69   gboolean anonymous;
70   GPasswordSave password_save;
71   int choice;
72 };
73
74 enum {
75   PROP_0,
76   PROP_USERNAME,
77   PROP_PASSWORD,
78   PROP_ANONYMOUS,
79   PROP_DOMAIN,
80   PROP_PASSWORD_SAVE,
81   PROP_CHOICE
82 };
83
84 static void 
85 g_mount_operation_set_property (GObject      *object,
86                                 guint         prop_id,
87                                 const GValue *value,
88                                 GParamSpec   *pspec)
89 {
90   GMountOperation *operation;
91
92   operation = G_MOUNT_OPERATION (object);
93
94   switch (prop_id)
95     {
96     case PROP_USERNAME:
97       g_mount_operation_set_username (operation, 
98                                       g_value_get_string (value));
99       break;
100    
101     case PROP_PASSWORD:
102       g_mount_operation_set_password (operation, 
103                                       g_value_get_string (value));
104       break;
105
106     case PROP_ANONYMOUS:
107       g_mount_operation_set_anonymous (operation, 
108                                        g_value_get_boolean (value));
109       break;
110
111     case PROP_DOMAIN:
112       g_mount_operation_set_domain (operation, 
113                                     g_value_get_string (value));
114       break;
115
116     case PROP_PASSWORD_SAVE:
117       g_mount_operation_set_password_save (operation, 
118                                            g_value_get_enum (value));
119       break;
120
121     case PROP_CHOICE:
122       g_mount_operation_set_choice (operation, 
123                                     g_value_get_int (value));
124       break;
125
126     default:
127       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
128       break;
129     }
130 }
131
132
133 static void 
134 g_mount_operation_get_property (GObject    *object,
135                                 guint       prop_id,
136                                 GValue     *value,
137                                 GParamSpec *pspec)
138 {
139   GMountOperation *operation;
140   GMountOperationPrivate *priv;
141
142   operation = G_MOUNT_OPERATION (object);
143   priv = operation->priv;
144   
145   switch (prop_id)
146     {
147     case PROP_USERNAME:
148       g_value_set_string (value, priv->user);
149       break;
150
151     case PROP_PASSWORD:
152       g_value_set_string (value, priv->password);
153       break;
154
155     case PROP_ANONYMOUS:
156       g_value_set_boolean (value, priv->anonymous);
157       break;
158
159     case PROP_DOMAIN:
160       g_value_set_string (value, priv->domain);
161       break;
162
163     case PROP_PASSWORD_SAVE:
164       g_value_set_enum (value, priv->password_save);
165       break;
166
167     case PROP_CHOICE:
168       g_value_set_int (value, priv->choice);
169       break;
170
171     default:
172       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
173       break;
174     }
175 }
176
177
178 static void
179 g_mount_operation_finalize (GObject *object)
180 {
181   GMountOperation *operation;
182   GMountOperationPrivate *priv;
183
184   operation = G_MOUNT_OPERATION (object);
185
186   priv = operation->priv;
187   
188   g_free (priv->password);
189   g_free (priv->user);
190   g_free (priv->domain);
191   
192   if (G_OBJECT_CLASS (g_mount_operation_parent_class)->finalize)
193     (*G_OBJECT_CLASS (g_mount_operation_parent_class)->finalize) (object);
194 }
195
196 static gboolean
197 reply_non_handled_in_idle (gpointer data)
198 {
199   GMountOperation *op = data;
200
201   g_mount_operation_reply (op, G_MOUNT_OPERATION_UNHANDLED);
202   return FALSE;
203 }
204
205 static void
206 ask_password (GMountOperation *op,
207               const char      *message,
208               const char      *default_user,
209               const char      *default_domain,
210               GAskPasswordFlags flags)
211 {
212   g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
213                    reply_non_handled_in_idle,
214                    g_object_ref (op),
215                    g_object_unref);
216 }
217   
218 static void
219 ask_question (GMountOperation *op,
220               const char      *message,
221               const char      *choices[])
222 {
223   g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
224                    reply_non_handled_in_idle,
225                    g_object_ref (op),
226                    g_object_unref);
227 }
228
229 static void
230 g_mount_operation_class_init (GMountOperationClass *klass)
231 {
232   GObjectClass *object_class;
233   
234   g_type_class_add_private (klass, sizeof (GMountOperationPrivate));
235  
236   object_class = G_OBJECT_CLASS (klass);
237   object_class->finalize = g_mount_operation_finalize;
238   object_class->get_property = g_mount_operation_get_property;
239   object_class->set_property = g_mount_operation_set_property;
240   
241   klass->ask_password = ask_password;
242   klass->ask_question = ask_question;
243   
244   /**
245    * GMountOperation::ask-password:
246    * @op: a #GMountOperation requesting a password.
247    * @message: string containing a message to display to the user.
248    * @default_user: string containing the default user name.
249    * @default_domain: string containing the default domain.
250    * @flags: a set of #GAskPasswordFlags.
251    * 
252    * Emitted when a mount operation asks the user for a password.
253    */
254   signals[ASK_PASSWORD] =
255     g_signal_new (I_("ask_password"),
256                   G_TYPE_FROM_CLASS (object_class),
257                   G_SIGNAL_RUN_LAST,
258                   G_STRUCT_OFFSET (GMountOperationClass, ask_password),
259                   NULL, NULL,
260                   _gio_marshal_VOID__STRING_STRING_STRING_FLAGS,
261                   G_TYPE_NONE, 4,
262                   G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ASK_PASSWORD_FLAGS);
263                   
264   /**
265    * GMountOperation::ask-question:
266    * @op: a #GMountOperation asking a question.
267    * @message: string containing a message to display to the user.
268    * @choices: an array of strings for each possible choice.
269    * 
270    * Emitted when asking the user a question and gives a list of 
271    * choices for the user to choose from. 
272    */
273   signals[ASK_QUESTION] =
274     g_signal_new (I_("ask_question"),
275                   G_TYPE_FROM_CLASS (object_class),
276                   G_SIGNAL_RUN_LAST,
277                   G_STRUCT_OFFSET (GMountOperationClass, ask_question),
278                   NULL, NULL,
279                   _gio_marshal_VOID__STRING_BOXED,
280                   G_TYPE_NONE, 2,
281                   G_TYPE_STRING, G_TYPE_STRV);
282                   
283   /**
284    * GMountOperation::reply:
285    * @op: a #GMountOperation.
286    * @abort: a boolean indicating %TRUE if the operation was aborted.
287    * 
288    * Emitted when the user has replied to the mount operation.
289    */
290   signals[REPLY] =
291     g_signal_new (I_("reply"),
292                   G_TYPE_FROM_CLASS (object_class),
293                   G_SIGNAL_RUN_LAST,
294                   G_STRUCT_OFFSET (GMountOperationClass, reply),
295                   NULL, NULL,
296                   g_cclosure_marshal_VOID__ENUM,
297                   G_TYPE_NONE, 1,
298                   G_TYPE_MOUNT_OPERATION_RESULT);
299
300   /**
301    * GMountOperation:username:
302    *
303    * The user name that is used for authentication when carrying out
304    * the mount operation.
305    */ 
306   g_object_class_install_property (object_class,
307                                    PROP_USERNAME,
308                                    g_param_spec_string ("username",
309                                                         P_("Username"),
310                                                         P_("The user name"),
311                                                         NULL,
312                                                         G_PARAM_READWRITE|
313                                                         G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
314
315   /**
316    * GMountOperation:password:
317    *
318    * The password that is used for authentication when carrying out
319    * the mount operation.
320    */ 
321   g_object_class_install_property (object_class,
322                                    PROP_PASSWORD,
323                                    g_param_spec_string ("password",
324                                                         P_("Password"),
325                                                         P_("The password"),
326                                                         NULL,
327                                                         G_PARAM_READWRITE|
328                                                         G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
329
330   /**
331    * GMountOperation:anonymous:
332    * 
333    * Whether to use an anonymous user when authenticating.
334    */
335   g_object_class_install_property (object_class,
336                                    PROP_ANONYMOUS,
337                                    g_param_spec_boolean ("anonymous",
338                                                          P_("Anonymous"),
339                                                          P_("Whether to use an anonymous user"),
340                                                          FALSE,
341                                                          G_PARAM_READWRITE|
342                                                          G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
343
344   /**
345    * GMountOperation:domain:
346    *
347    * The domain to use for the mount operation.
348    */ 
349   g_object_class_install_property (object_class,
350                                    PROP_DOMAIN,
351                                    g_param_spec_string ("domain",
352                                                         P_("Domain"),
353                                                         P_("The domain of the mount operation"),
354                                                         NULL,
355                                                         G_PARAM_READWRITE|
356                                                         G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
357
358   /**
359    * GMountOperation:password-save:
360    *
361    * Determines if and how the password information should be saved. 
362    */ 
363   g_object_class_install_property (object_class,
364                                    PROP_PASSWORD_SAVE,
365                                    g_param_spec_enum ("password-save",
366                                                       P_("Password save"),
367                                                       P_("How passwords should be saved"),
368                                                       G_TYPE_PASSWORD_SAVE,
369                                                       G_PASSWORD_SAVE_NEVER,
370                                                       G_PARAM_READWRITE|
371                                                       G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
372
373   /**
374    * GMountOperation:choice:
375    *
376    * The index of the user's choice when a question is asked during the 
377    * mount operation. See the #GMountOperation::ask-question signal.
378    */ 
379   g_object_class_install_property (object_class,
380                                    PROP_CHOICE,
381                                    g_param_spec_int ("choice",
382                                                      P_("Choice"),
383                                                      P_("The users choice"),
384                                                      0, G_MAXINT, 0,
385                                                      G_PARAM_READWRITE|
386                                                      G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
387 }
388
389 static void
390 g_mount_operation_init (GMountOperation *operation)
391 {
392   operation->priv = G_TYPE_INSTANCE_GET_PRIVATE (operation,
393                                                  G_TYPE_MOUNT_OPERATION,
394                                                  GMountOperationPrivate);
395 }
396
397 /**
398  * g_mount_operation_new:
399  * 
400  * Creates a new mount operation.
401  * 
402  * Returns: a #GMountOperation.
403  **/
404 GMountOperation *
405 g_mount_operation_new (void)
406 {
407   return g_object_new (G_TYPE_MOUNT_OPERATION, NULL);
408 }
409
410 /**
411  * g_mount_operation_get_username
412  * @op: a #GMountOperation.
413  * 
414  * Get the user name from the mount operation.
415  *
416  * Returns: a string containing the user name.
417  **/
418 const char *
419 g_mount_operation_get_username (GMountOperation *op)
420 {
421   g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), NULL);
422   return op->priv->user;
423 }
424
425 /**
426  * g_mount_operation_set_username:
427  * @op: a #GMountOperation.
428  * @username: input username.
429  *
430  * Sets the user name within @op to @username.
431  * 
432  **/
433 void
434 g_mount_operation_set_username (GMountOperation *op,
435                                 const char      *username)
436 {
437   g_return_if_fail (G_IS_MOUNT_OPERATION (op));
438   g_free (op->priv->user);
439   op->priv->user = g_strdup (username);
440   g_object_notify (G_OBJECT (op), "username");
441 }
442
443 /**
444  * g_mount_operation_get_password:
445  * @op: a #GMountOperation.
446  *
447  * Gets a password from the mount operation. 
448  *
449  * Returns: a string containing the password within @op.
450  **/
451 const char *
452 g_mount_operation_get_password (GMountOperation *op)
453 {
454   g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), NULL);
455   return op->priv->password;
456 }
457
458 /**
459  * g_mount_operation_set_password:
460  * @op: a #GMountOperation.
461  * @password: password to set.
462  * 
463  * Sets the mount operation's password to @password.  
464  *
465  **/
466 void
467 g_mount_operation_set_password (GMountOperation *op,
468                                 const char      *password)
469 {
470   g_return_if_fail (G_IS_MOUNT_OPERATION (op));
471   g_free (op->priv->password);
472   op->priv->password = g_strdup (password);
473   g_object_notify (G_OBJECT (op), "password");
474 }
475
476 /**
477  * g_mount_operation_get_anonymous:
478  * @op: a #GMountOperation.
479  * 
480  * Check to see whether the mount operation is being used 
481  * for an anonymous user.
482  * 
483  * Returns: %TRUE if mount operation is anonymous. 
484  **/
485 gboolean
486 g_mount_operation_get_anonymous (GMountOperation *op)
487 {
488   g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), FALSE);
489   return op->priv->anonymous;
490 }
491
492 /**
493  * g_mount_operation_set_anonymous:
494  * @op: a #GMountOperation.
495  * @anonymous: boolean value.
496  * 
497  * Sets the mount operation to use an anonymous user if @anonymous is %TRUE.
498  **/  
499 void
500 g_mount_operation_set_anonymous (GMountOperation *op,
501                                  gboolean         anonymous)
502 {
503   GMountOperationPrivate *priv;
504   g_return_if_fail (G_IS_MOUNT_OPERATION (op));
505   priv = op->priv;
506
507   if (priv->anonymous != anonymous)
508     {
509       priv->anonymous = anonymous;
510       g_object_notify (G_OBJECT (op), "anonymous");
511     }
512 }
513
514 /**
515  * g_mount_operation_get_domain:
516  * @op: a #GMountOperation.
517  * 
518  * Gets the domain of the mount operation.
519  * 
520  * Returns: a string set to the domain. 
521  **/
522 const char *
523 g_mount_operation_get_domain (GMountOperation *op)
524 {
525   g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), NULL);
526   return op->priv->domain;
527 }
528
529 /**
530  * g_mount_operation_set_domain:
531  * @op: a #GMountOperation.
532  * @domain: the domain to set.
533  * 
534  * Sets the mount operation's domain. 
535  **/  
536 void
537 g_mount_operation_set_domain (GMountOperation *op,
538                               const char      *domain)
539 {
540   g_return_if_fail (G_IS_MOUNT_OPERATION (op));
541   g_free (op->priv->domain);
542   op->priv->domain = g_strdup (domain);
543   g_object_notify (G_OBJECT (op), "domain");
544 }
545
546 /**
547  * g_mount_operation_get_password_save:
548  * @op: a #GMountOperation.
549  * 
550  * Gets the state of saving passwords for the mount operation.
551  *
552  * Returns: a #GPasswordSave flag. 
553  **/  
554
555 GPasswordSave
556 g_mount_operation_get_password_save (GMountOperation *op)
557 {
558   g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), G_PASSWORD_SAVE_NEVER);
559   return op->priv->password_save;
560 }
561
562 /**
563  * g_mount_operation_set_password_save:
564  * @op: a #GMountOperation.
565  * @save: a set of #GPasswordSave flags.
566  * 
567  * Sets the state of saving passwords for the mount operation.
568  * 
569  **/   
570 void
571 g_mount_operation_set_password_save (GMountOperation *op,
572                                      GPasswordSave    save)
573 {
574   GMountOperationPrivate *priv;
575   g_return_if_fail (G_IS_MOUNT_OPERATION (op));
576   priv = op->priv;
577  
578   if (priv->password_save != save)
579     {
580       priv->password_save = save;
581       g_object_notify (G_OBJECT (op), "password-save");
582     }
583 }
584
585 /**
586  * g_mount_operation_get_choice:
587  * @op: a #GMountOperation.
588  * 
589  * Gets a choice from the mount operation.
590  *
591  * Returns: an integer containing an index of the user's choice from 
592  * the choice's list, or %0.
593  **/
594 int
595 g_mount_operation_get_choice (GMountOperation *op)
596 {
597   g_return_val_if_fail (G_IS_MOUNT_OPERATION (op), 0);
598   return op->priv->choice;
599 }
600
601 /**
602  * g_mount_operation_set_choice:
603  * @op: a #GMountOperation.
604  * @choice: an integer.
605  *
606  * Sets a default choice for the mount operation.
607  **/
608 void
609 g_mount_operation_set_choice (GMountOperation *op,
610                               int              choice)
611 {
612   GMountOperationPrivate *priv;
613   g_return_if_fail (G_IS_MOUNT_OPERATION (op));
614   priv = op->priv;
615   if (priv->choice != choice)
616     {
617       priv->choice = choice;
618       g_object_notify (G_OBJECT (op), "choice");
619     }
620 }
621
622 /**
623  * g_mount_operation_reply:
624  * @op: a #GMountOperation
625  * @result: a #GMountOperationResult
626  * 
627  * Emits the #GMountOperation::reply signal.
628  **/
629 void
630 g_mount_operation_reply (GMountOperation *op,
631                          GMountOperationResult result)
632 {
633   g_return_if_fail (G_IS_MOUNT_OPERATION (op));
634   g_signal_emit (op, signals[REPLY], 0, result);
635 }
636
637 #define __G_MOUNT_OPERATION_C__
638 #include "gioaliasdef.c"