2 * Copyright (C) 2007 Benjamin Otte <otte@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301 USA
25 #include "swfdec_load_object.h"
26 #include "swfdec_as_strings.h"
27 #include "swfdec_debug.h"
28 #include "swfdec_loader_internal.h"
29 #include "swfdec_loadertarget.h"
30 #include "swfdec_player_internal.h"
32 /*** SWFDEC_LOADER_TARGET ***/
35 swfdec_load_object_loader_target_get_player (SwfdecLoaderTarget
*target
)
37 return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (target
)->context
);
41 swfdec_load_object_loader_target_parse (SwfdecLoaderTarget
*target
,
45 SwfdecLoadObject
*load_object
= SWFDEC_LOAD_OBJECT (target
);
47 SWFDEC_AS_VALUE_SET_INT (&val
, swfdec_loader_get_loaded (loader
));
48 swfdec_as_object_set_variable_and_flags (load_object
->target
,
49 SWFDEC_AS_STR__bytesLoaded
, &val
, SWFDEC_AS_VARIABLE_HIDDEN
);
51 SWFDEC_AS_VALUE_SET_INT (&val
, swfdec_loader_get_size (loader
));
52 swfdec_as_object_set_variable_and_flags (load_object
->target
,
53 SWFDEC_AS_STR__bytesTotal
, &val
, SWFDEC_AS_VARIABLE_HIDDEN
);
57 swfdec_load_object_ondata (SwfdecLoadObject
*load_object
)
61 if (load_object
->text
) {
62 SWFDEC_AS_VALUE_SET_STRING (&val
,
63 swfdec_as_context_get_string (load_object
->target
->context
,
66 SWFDEC_AS_VALUE_SET_UNDEFINED (&val
);
68 swfdec_as_object_call (load_object
->target
, SWFDEC_AS_STR_onData
, 1, &val
,
73 swfdec_load_object_loader_target_error (SwfdecLoaderTarget
*target
,
76 SwfdecLoadObject
*load_object
= SWFDEC_LOAD_OBJECT (target
);
78 /* break reference to the loader */
79 swfdec_loader_set_target (loader
, NULL
);
80 load_object
->loader
= NULL
;
81 g_object_unref (loader
);
83 swfdec_load_object_ondata (load_object
);
87 swfdec_load_object_loader_target_eof (SwfdecLoaderTarget
*target
,
90 SwfdecLoadObject
*load_object
= SWFDEC_LOAD_OBJECT (target
);
93 /* get the text from the loader */
94 size
= swfdec_buffer_queue_get_depth (loader
->queue
);
95 load_object
->text
= g_try_malloc (size
+ 1);
96 if (load_object
->text
) {
99 while ((buffer
= swfdec_buffer_queue_pull_buffer (loader
->queue
))) {
100 memcpy (load_object
->text
+ i
, buffer
->data
, buffer
->length
);
102 swfdec_buffer_unref (buffer
);
104 g_assert (i
== size
);
105 load_object
->text
[size
] = '\0';
106 /* FIXME: validate otherwise? */
107 if (!g_utf8_validate (load_object
->text
, size
, NULL
)) {
108 SWFDEC_ERROR ("downloaded data is not valid utf-8");
109 g_free (load_object
->text
);
110 load_object
->text
= NULL
;
113 SWFDEC_ERROR ("not enough memory to copy %u bytes", size
);
116 /* break reference to the loader */
117 swfdec_loader_set_target (loader
, NULL
);
118 load_object
->loader
= NULL
;
119 g_object_unref (loader
);
121 swfdec_load_object_ondata (load_object
);
125 swfdec_load_object_loader_target_init (SwfdecLoaderTargetInterface
*iface
)
127 iface
->get_player
= swfdec_load_object_loader_target_get_player
;
128 iface
->parse
= swfdec_load_object_loader_target_parse
;
129 iface
->eof
= swfdec_load_object_loader_target_eof
;
130 iface
->error
= swfdec_load_object_loader_target_error
;
133 /*** SWFDEC_LOAD_OBJECT ***/
135 G_DEFINE_TYPE_WITH_CODE (SwfdecLoadObject
, swfdec_load_object
, SWFDEC_TYPE_AS_OBJECT
,
136 G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET
, swfdec_load_object_loader_target_init
))
139 swfdec_load_object_reset (SwfdecLoadObject
*load_object
)
141 if (load_object
->loader
) {
142 swfdec_loader_set_target (load_object
->loader
, NULL
);
143 g_object_unref (load_object
->loader
);
144 load_object
->loader
= NULL
;
146 g_free (load_object
->text
);
147 load_object
->text
= NULL
;
151 swfdec_load_object_mark (SwfdecAsObject
*object
)
153 swfdec_as_object_mark (SWFDEC_LOAD_OBJECT (object
)->target
);
155 SWFDEC_AS_OBJECT_CLASS (swfdec_load_object_parent_class
)->mark (object
);
159 swfdec_load_object_dispose (GObject
*object
)
161 SwfdecLoadObject
*load_object
= SWFDEC_LOAD_OBJECT (object
);
163 swfdec_load_object_reset (load_object
);
165 G_OBJECT_CLASS (swfdec_load_object_parent_class
)->dispose (object
);
169 swfdec_load_object_class_init (SwfdecLoadObjectClass
*klass
)
171 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
172 SwfdecAsObjectClass
*as_object_class
= SWFDEC_AS_OBJECT_CLASS (klass
);
174 object_class
->dispose
= swfdec_load_object_dispose
;
176 as_object_class
->mark
= swfdec_load_object_mark
;
180 swfdec_load_object_init (SwfdecLoadObject
*load_object
)
185 swfdec_load_object_load (SwfdecLoadObject
*load_object
, const char *url
)
189 g_return_if_fail (SWFDEC_IS_LOAD_OBJECT (load_object
));
190 g_return_if_fail (url
!= NULL
);
192 swfdec_load_object_reset (load_object
);
193 load_object
->loader
= swfdec_player_load (
194 SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load_object
)->context
), url
);
195 swfdec_loader_set_target (load_object
->loader
,
196 SWFDEC_LOADER_TARGET (load_object
));
197 swfdec_loader_set_data_type (load_object
->loader
, SWFDEC_LOADER_DATA_TEXT
);
199 SWFDEC_AS_VALUE_SET_INT (&val
, 0);
200 swfdec_as_object_set_variable_and_flags (load_object
->target
,
201 SWFDEC_AS_STR__bytesLoaded
, &val
, SWFDEC_AS_VARIABLE_HIDDEN
);
202 SWFDEC_AS_VALUE_SET_UNDEFINED (&val
);
203 swfdec_as_object_set_variable_and_flags (load_object
->target
,
204 SWFDEC_AS_STR__bytesTotal
, &val
, SWFDEC_AS_VARIABLE_HIDDEN
);
206 SWFDEC_AS_VALUE_SET_BOOLEAN (&val
, FALSE
);
207 swfdec_as_object_set_variable_and_flags (load_object
->target
,
208 SWFDEC_AS_STR_loaded
, &val
, SWFDEC_AS_VARIABLE_HIDDEN
);
212 swfdec_load_object_new (SwfdecAsObject
*target
, const char *url
)
214 SwfdecAsObject
*load_object
;
216 g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (target
), NULL
);
217 g_return_val_if_fail (url
!= NULL
, NULL
);
219 if (!swfdec_as_context_use_mem (target
->context
, sizeof (SwfdecLoadObject
)))
221 load_object
= g_object_new (SWFDEC_TYPE_LOAD_OBJECT
, NULL
);
222 swfdec_as_object_add (load_object
, target
->context
,
223 sizeof (SwfdecLoadObject
));
225 SWFDEC_LOAD_OBJECT (load_object
)->target
= target
;
227 SWFDEC_PLAYER (target
->context
)->load_objects
=
228 g_list_append (SWFDEC_PLAYER (target
->context
)->load_objects
, load_object
);
230 swfdec_load_object_load (SWFDEC_LOAD_OBJECT (load_object
), url
);