mirror of
				https://github.com/owntone/owntone-server.git
				synced 2025-10-29 15:55:02 -04:00 
			
		
		
		
	Stop serializing to memory
This commit is contained in:
		
							parent
							
								
									58faf3f8f9
								
							
						
					
					
						commit
						47148ed0f6
					
				
							
								
								
									
										143
									
								
								src/daap-proto.c
									
									
									
									
									
								
							
							
						
						
									
										143
									
								
								src/daap-proto.c
									
									
									
									
									
								
							| @ -37,10 +37,6 @@ | ||||
| DAAP_BLOCK *daap_get_new(void); | ||||
| DAAP_BLOCK *daap_add_formatted(DAAP_BLOCK *parent, char *tag,  | ||||
| 			       int len, char *value); | ||||
| int daap_serialmem(DAAP_BLOCK *root, char *where); | ||||
| int daap_compress(char *input, long in_len, char *output, long *out_len); | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * daap_get_new | ||||
|  * | ||||
| @ -239,160 +235,43 @@ DAAP_BLOCK *daap_add_empty(DAAP_BLOCK *parent, char *tag) { | ||||
| /*
 | ||||
|  * daap_serialmem | ||||
|  * | ||||
|  * Serialize a daap tree to memory, so it can be | ||||
|  * gzipped | ||||
|  * Serialize a daap tree to a fd; | ||||
|  */ | ||||
| int daap_serialmem(DAAP_BLOCK *root, char *where) { | ||||
| int daap_serialize(DAAP_BLOCK *root, int fd, int gzip) { | ||||
|     DAAP_BLOCK *current; | ||||
|     char size[4]; | ||||
| 
 | ||||
|     if(!root) | ||||
| 	return 0; | ||||
| 
 | ||||
|     DPRINTF(ERR_DEBUG,"Serializing %c%c%c%c\n",root->tag[0],root->tag[1], | ||||
| 	    root->tag[2],root->tag[3]); | ||||
| 
 | ||||
| 
 | ||||
|     memcpy(where,root->tag,4); | ||||
|     where+=4; | ||||
|      | ||||
|     r_write(fd,root->tag,4); | ||||
| 
 | ||||
|     size[0] = (root->reported_size >> 24) & 0xFF; | ||||
|     size[1] = (root->reported_size >> 16) & 0xFF; | ||||
|     size[2] = (root->reported_size >> 8 ) & 0xFF; | ||||
|     size[3] = (root->reported_size) & 0xFF; | ||||
| 
 | ||||
|     memcpy(where,&size,4); | ||||
|     where+=4; | ||||
|     r_write(fd,&size,4); | ||||
| 
 | ||||
|     if(root->size) { | ||||
| 	if(root->free) | ||||
| 	    memcpy(where,root->value,root->size); | ||||
| 	    r_write(fd,root->value,root->size); | ||||
| 	else | ||||
| 	    memcpy(where,root->svalue,root->size); | ||||
| 
 | ||||
| 	where+=root->size; | ||||
| 	    r_write(fd,root->svalue,root->size); | ||||
|     } | ||||
|      | ||||
|     if(root->children) { | ||||
| 	if(daap_serialmem(root->children,where)) | ||||
| 	    return -1; | ||||
| 	 | ||||
| 	where += root->reported_size; | ||||
| 	if(daap_serialize(root->children,fd,gzip)) | ||||
| 	   return -1; | ||||
|     } | ||||
| 
 | ||||
|     if(daap_serialmem(root->next,where)) | ||||
|     if(daap_serialize(root->next,fd,gzip)) | ||||
| 	return -1; | ||||
| 
 | ||||
|      | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * daap_serialize | ||||
|  * | ||||
|  * Throw the whole daap structure out a fd (depth first), | ||||
|  * gzipped | ||||
|  * | ||||
|  * FIXME: this is gross.  clean this up | ||||
|  */ | ||||
| int daap_serialize(DAAP_BLOCK *root, int fd, int gzip) { | ||||
|     char *uncompressed; | ||||
|     long uncompressed_len; | ||||
|     char *compressed; | ||||
|     long compressed_len; | ||||
|     int err; | ||||
| 
 | ||||
|     uncompressed_len = root->reported_size + 8; | ||||
|     uncompressed=(char*)malloc(uncompressed_len+1); | ||||
|     if(!uncompressed) { | ||||
| 	DPRINTF(ERR_INFO,"Error allocating serialization block\n"); | ||||
| 	daap_free(root); | ||||
| 	return -1; | ||||
|     } | ||||
| 
 | ||||
|     daap_serialmem(root,uncompressed); | ||||
|     daap_free(root); | ||||
| 
 | ||||
|     if(gzip) { | ||||
| 	/* guarantee enough buffer space */ | ||||
| 	compressed_len = uncompressed_len * 101/100 + 12; | ||||
| 	compressed=(char*)malloc(compressed_len); | ||||
| 	if(!compressed) { | ||||
| 	    DPRINTF(ERR_INFO,"Error allocation compression block\n"); | ||||
| 	    free(uncompressed); | ||||
| 	    return -1; | ||||
| 	} | ||||
| 	 | ||||
| 	/*
 | ||||
| 	err=daap_compress(uncompressed,uncompressed_len, | ||||
| 			  compressed, &compressed_len); | ||||
| 	*/ | ||||
| 
 | ||||
| 	if(err) { | ||||
| 	    DPRINTF(ERR_INFO,"Error compressing: %s\n",strerror(errno)); | ||||
| 	    free(uncompressed); | ||||
| 	    free(compressed); | ||||
| 	    return -1; | ||||
| 	} | ||||
| 
 | ||||
| 	if(r_write(fd,compressed,compressed_len) != compressed_len) { | ||||
| 	    DPRINTF(ERR_INFO,"Error writing compressed daap stream\n"); | ||||
| 	    free(uncompressed); | ||||
| 	    free(compressed); | ||||
| 	    return -1; | ||||
| 	} | ||||
| 	free(compressed); | ||||
| 	free(uncompressed); | ||||
|     } else { | ||||
| 	if(r_write(fd,uncompressed,uncompressed_len) != uncompressed_len) { | ||||
| 	    DPRINTF(ERR_INFO,"Error writing uncompressed daap stream\n"); | ||||
| 	    free(uncompressed); | ||||
| 	    return -1; | ||||
| 	} | ||||
| 	free(uncompressed); | ||||
|     } | ||||
| 
 | ||||
|     DPRINTF(ERR_DEBUG,"Finished serializing\n"); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * daap_compress | ||||
|  * | ||||
|  * The zlib library is documented as threadsafe so long as | ||||
|  * the zalloc and zfree routines are implemented reentrantly. | ||||
|  * | ||||
|  * I have no idea what platforms this will be ported to, | ||||
|  * and even though I do not believe the functions I am using | ||||
|  * will call zalloc or zfree, I am going to put this function | ||||
|  * in a critical section.  Someone with more knowledge of zlib | ||||
|  * than I can determine if it is really necessary. | ||||
|  * | ||||
|  * This doesn't actually do gzip encoding -- it does a full | ||||
|  * gzip-style file, including header info.  This is not what | ||||
|  * we want | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
| int daap_compress(char *input, long in_len, char *output, long *out_len) { | ||||
|     int err; | ||||
| 
 | ||||
|     err=compress(output,out_len,input,in_len); | ||||
|     switch(err) { | ||||
|     case Z_OK: | ||||
| 	break; | ||||
|     case Z_MEM_ERROR: | ||||
| 	errno=ENOMEM; | ||||
| 	break; | ||||
|     case Z_BUF_ERROR: | ||||
| 	errno=EINVAL; | ||||
| 	break; | ||||
|     } | ||||
| 
 | ||||
|     return (err == Z_OK ? 0 : -1); | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|  * daap_free | ||||
|  * | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user