710
748
/**********************************************************************/
751
* cd_client_import_get_profile_destination:
754
cd_client_import_get_profile_destination (GFile *file)
760
g_return_val_if_fail (file != NULL, NULL);
762
/* get destination filename for this source file */
763
basename = g_file_get_basename (file);
764
destination = g_build_filename (g_get_user_data_dir (), "icc", basename, NULL);
765
dest = g_file_new_for_path (destination);
768
g_free (destination);
773
* cd_client_import_mkdir_and_copy:
776
cd_client_import_mkdir_and_copy (GFile *source,
778
GCancellable *cancellable,
784
g_return_val_if_fail (source != NULL, FALSE);
785
g_return_val_if_fail (destination != NULL, FALSE);
788
parent = g_file_get_parent (destination);
790
/* create directory */
791
if (!g_file_query_exists (parent, cancellable)) {
792
ret = g_file_make_directory_with_parents (parent, cancellable, error);
798
ret = g_file_copy (source, destination,
799
G_FILE_COPY_OVERWRITE,
800
cancellable, NULL, NULL, error);
804
g_object_unref (parent);
810
GCancellable *cancellable;
813
GSimpleAsyncResult *res;
815
guint profile_added_id;
816
} CdClientImportHelper;
819
* cd_client_import_profile_finish:
820
* @client: a #CdClient instance.
821
* @res: the #GAsyncResult
822
* @error: A #GError or %NULL
824
* Gets the result from the asynchronous function.
826
* Return value: (transfer full): a #CdProfile or %NULL
831
cd_client_import_profile_finish (CdClient *client,
835
GSimpleAsyncResult *simple;
837
g_return_val_if_fail (CD_IS_CLIENT (client), NULL);
838
g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (res), NULL);
839
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
841
simple = G_SIMPLE_ASYNC_RESULT (res);
842
if (g_simple_async_result_propagate_error (simple, error))
845
return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple));
849
cd_client_import_free_helper (CdClientImportHelper *helper)
851
g_object_unref (helper->file);
852
g_object_unref (helper->dest);
853
if (helper->cancellable != NULL)
854
g_object_unref (helper->cancellable);
855
if (helper->profile_added_id > 0)
856
g_signal_handler_disconnect (helper->client, helper->profile_added_id);
857
if (helper->hangcheck_id > 0)
858
g_source_remove (helper->hangcheck_id);
859
g_object_unref (helper->client);
860
g_object_unref (helper->res);
865
cd_client_import_profile_added_cb (CdClient *client,
869
CdClientImportHelper *helper = (CdClientImportHelper *) user_data;
872
g_simple_async_result_set_op_res_gpointer (helper->res,
873
g_object_ref (profile),
874
(GDestroyNotify) g_object_unref);
875
g_simple_async_result_complete_in_idle (helper->res);
876
cd_client_import_free_helper (helper);
880
cd_client_import_hangcheck_cb (gpointer user_data)
882
CdClientImportHelper *helper = (CdClientImportHelper *) user_data;
883
g_simple_async_result_set_error (helper->res,
885
CD_CLIENT_ERROR_FAILED,
886
"The profile was not added in time");
887
g_simple_async_result_complete_in_idle (helper->res);
888
helper->hangcheck_id = 0;
889
cd_client_import_free_helper (helper);
894
cd_client_import_profile_find_filename_cb (GObject *source_object,
900
gchar *filename = NULL;
901
GError *error = NULL;
902
CdClientImportHelper *helper = (CdClientImportHelper *) user_data;
904
/* does the profile already exist */
905
profile = cd_client_find_profile_by_filename_finish (CD_CLIENT (source_object),
908
if (profile != NULL) {
909
filename = g_file_get_path (helper->dest);
910
g_simple_async_result_set_error (helper->res,
912
CD_CLIENT_ERROR_ALREADY_EXISTS,
913
"The profile %s already exists",
915
g_simple_async_result_complete_in_idle (helper->res);
916
cd_client_import_free_helper (helper);
919
if (error->domain != CD_CLIENT_ERROR ||
920
error->code != CD_CLIENT_ERROR_FAILED) {
921
g_simple_async_result_set_error (helper->res,
923
CD_CLIENT_ERROR_FAILED,
924
"Failed to import: %s",
926
g_simple_async_result_complete_in_idle (helper->res);
927
cd_client_import_free_helper (helper);
928
g_error_free (error);
932
/* reset the error */
933
g_clear_error (&error);
935
/* watch for a new profile to be detected and added,
936
* but time out after a couple of seconds */
937
helper->hangcheck_id = g_timeout_add (CD_CLIENT_IMPORT_DAEMON_TIMEOUT,
938
cd_client_import_hangcheck_cb,
940
helper->profile_added_id = g_signal_connect (helper->client, "profile-added",
941
G_CALLBACK (cd_client_import_profile_added_cb),
944
/* copy profile to the correct place */
945
ret = cd_client_import_mkdir_and_copy (helper->file,
950
g_simple_async_result_set_error (helper->res,
952
CD_CLIENT_ERROR_FAILED,
953
"Failed to copy: %s",
955
g_error_free (error);
956
g_simple_async_result_complete_in_idle (helper->res);
957
cd_client_import_free_helper (helper);
963
g_object_unref (profile);
967
cd_client_import_profile_query_info_cb (GObject *source_object,
972
gchar *filename = NULL;
973
GError *error = NULL;
975
CdClientImportHelper *helper = (CdClientImportHelper *) user_data;
977
/* get the file info */
978
filename = g_file_get_path (helper->dest);
979
info = g_file_query_info_finish (G_FILE (source_object),
983
g_simple_async_result_set_error (helper->res,
985
CD_CLIENT_ERROR_FAILED,
986
"Cannot get content type for %s: %s",
989
g_error_free (error);
990
g_simple_async_result_complete_in_idle (helper->res);
991
cd_client_import_free_helper (helper);
995
/* check the content type */
996
type = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
997
if (g_strcmp0 (type, "application/vnd.iccprofile") != 0) {
998
g_simple_async_result_set_error (helper->res,
1000
CD_CLIENT_ERROR_FILE_INVALID,
1001
"Incorrect content type for %s, got %s",
1003
g_simple_async_result_complete_in_idle (helper->res);
1004
cd_client_import_free_helper (helper);
1008
/* does this profile already exist? */
1009
cd_client_find_profile_by_filename (helper->client,
1011
helper->cancellable,
1012
cd_client_import_profile_find_filename_cb,
1016
g_object_unref (info);
1021
* cd_client_import_profile:
1022
* @client: a #CdClient instance.
1024
* @cancellable: a #GCancellable, or %NULL
1025
* @callback: the function to run on completion
1026
* @user_data: the data to pass to @callback
1028
* Imports a color profile into the users home directory.
1030
* If the profile should be accessable for all users, then call
1031
* cd_profile_install_system_wide() on the result.
1036
cd_client_import_profile (CdClient *client,
1038
GCancellable *cancellable,
1039
GAsyncReadyCallback callback,
1042
CdClientImportHelper *helper;
1044
g_return_if_fail (CD_IS_CLIENT (client));
1045
g_return_if_fail (G_IS_FILE (file));
1046
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
1048
helper = g_new0 (CdClientImportHelper, 1);
1049
helper->client = g_object_ref (client);
1050
helper->res = g_simple_async_result_new (G_OBJECT (client),
1053
cd_client_import_profile);
1054
helper->file = g_object_ref (file);
1055
helper->dest = cd_client_import_get_profile_destination (file);
1056
if (cancellable != NULL)
1057
helper->cancellable = g_object_ref (cancellable);
1059
/* check the file really is an ICC file */
1060
g_file_query_info_async (helper->file,
1061
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
1062
G_FILE_QUERY_INFO_NONE,
1064
helper->cancellable,
1065
cd_client_import_profile_query_info_cb,
1069
/**********************************************************************/
713
1072
* cd_client_delete_device_finish:
714
1073
* @client: a #CdClient instance.
715
1074
* @res: the #GAsyncResult