mirror of
				https://git.proxmox.com/git/fwupd
				synced 2025-10-31 14:14:46 +00:00 
			
		
		
		
	dfu: Add dfu_element_get_contents_chunk()
This commit is contained in:
		
							parent
							
								
									c5454860d4
								
							
						
					
					
						commit
						15aa91bbd1
					
				| @ -39,6 +39,8 @@ | ||||
| #include "dfu-common.h" | ||||
| #include "dfu-element.h" | ||||
| 
 | ||||
| #include "fwupd-error.h" | ||||
| 
 | ||||
| static void dfu_element_finalize			 (GObject *object); | ||||
| 
 | ||||
| typedef struct { | ||||
| @ -252,3 +254,60 @@ dfu_element_set_target_size (DfuElement *element, guint32 target_size) | ||||
| 	g_bytes_unref (priv->contents); | ||||
| 	priv->contents = g_bytes_new_take (buf, target_size); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * dfu_element_get_contents_chunk: | ||||
|  * @element: a #DfuElement | ||||
|  * @address: an address greater than dfu_element_get_address() | ||||
|  * @chunk_sz_max: the size of the new chunk | ||||
|  * @error: a #GError, or %NULL | ||||
|  * | ||||
|  * Gets a block of data from the @element. If the contents of the element is | ||||
|  * smaller than the requested chunk size then the #GBytes will be smaller | ||||
|  * than @chunk_sz_max. Use dfu_utils_bytes_pad() if padding is required. | ||||
|  * | ||||
|  * If the @address is larger than the size of the @element then an error is returned. | ||||
|  * | ||||
|  * Return value: (transfer full): a #GBytes, or %NULL | ||||
|  **/ | ||||
| GBytes * | ||||
| dfu_element_get_contents_chunk (DfuElement *element, | ||||
| 				guint32 address, | ||||
| 				guint32 chunk_sz_max, | ||||
| 				GError **error) | ||||
| { | ||||
| 	GBytes *blob; | ||||
| 	gsize chunk_left; | ||||
| 	guint32 offset; | ||||
| 
 | ||||
| 	/* check address requested is larger than base address */ | ||||
| 	if (address < dfu_element_get_address (element)) { | ||||
| 		g_set_error (error, | ||||
| 			     FWUPD_ERROR, | ||||
| 			     FWUPD_ERROR_INTERNAL, | ||||
| 			     "requested address 0x%x less than base address 0x%x", | ||||
| 			     (guint) address, (guint) dfu_element_get_address (element)); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/* offset into data */ | ||||
| 	offset = address - dfu_element_get_address (element); | ||||
| 	blob = dfu_element_get_contents (element); | ||||
| 	if (offset > g_bytes_get_size (blob)) { | ||||
| 		g_set_error (error, | ||||
| 			     FWUPD_ERROR, | ||||
| 			     FWUPD_ERROR_NOT_FOUND, | ||||
| 			     "offset 0x%x larger than data size 0x%x", | ||||
| 			     (guint) offset, | ||||
| 			     (guint) g_bytes_get_size (blob)); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/* if we have less data than requested */ | ||||
| 	chunk_left = g_bytes_get_size (blob) - offset; | ||||
| 	if (chunk_sz_max > chunk_left) | ||||
| 		return g_bytes_new_from_bytes (blob, offset, chunk_left); | ||||
| 
 | ||||
| 	/* check chunk */ | ||||
| 	return g_bytes_new_from_bytes (blob, offset, chunk_sz_max); | ||||
| } | ||||
|  | ||||
| @ -39,6 +39,10 @@ DfuElement	*dfu_element_new		(void); | ||||
| 
 | ||||
| GBytes		*dfu_element_get_contents	(DfuElement	*element); | ||||
| guint32		 dfu_element_get_address	(DfuElement	*element); | ||||
| GBytes		*dfu_element_get_contents_chunk	(DfuElement	*element, | ||||
| 						 guint32	 address, | ||||
| 						 guint32	 chunk_sz_max, | ||||
| 						 GError		**error); | ||||
| 
 | ||||
| void		 dfu_element_set_contents	(DfuElement	*element, | ||||
| 						 GBytes		*contents); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Richard Hughes
						Richard Hughes