More plugin work

This commit is contained in:
Ron Pedde 2006-04-21 06:43:41 +00:00
parent 03664de092
commit 433a2ce666
9 changed files with 133 additions and 10 deletions

View File

@ -49,7 +49,7 @@ mtd_update_SOURCES = mtd-update.c conf.c conf.h ll.c ll.h \
db-sql.c db-sql.h db-generic.c db-generic.h smart-parser.c \ db-sql.c db-sql.h db-generic.c db-generic.h smart-parser.c \
smart-parser.h err.c err.h os-unix.c os.h xml-rpc.c xml-rpc.h \ smart-parser.h err.c err.h os-unix.c os.h xml-rpc.c xml-rpc.h \
restart.c restart.h uici.c uici.h ssc.c ssc.h \ restart.c restart.h uici.c uici.h ssc.c ssc.h \
webserver.c webserver.h compat.c compat.h plugin.c plugin.h \ webserver.c webserver.h compat.c compat.h \
$(PRENDSRC) $(ORENDSRC) $(HRENDSRC) \ $(PRENDSRC) $(ORENDSRC) $(HRENDSRC) \
$(SQLITEDB) $(SQLITE3DB) $(SQLITEDB) $(SQLITE3DB)

View File

@ -61,6 +61,7 @@ typedef struct tag_db_functions {
int(*dbs_enum_start)(char **, DBQUERYINFO *); int(*dbs_enum_start)(char **, DBQUERYINFO *);
int(*dbs_enum_size)(char **, DBQUERYINFO *, int *, int *); int(*dbs_enum_size)(char **, DBQUERYINFO *, int *, int *);
int(*dbs_enum_fetch)(char **, DBQUERYINFO *, int *, unsigned char **); int(*dbs_enum_fetch)(char **, DBQUERYINFO *, int *, unsigned char **);
int(*dbs_enum_fetch_row)(char **, PACKED_MP3FILE *, DBQUERYINFO *);
int(*dbs_enum_reset)(char **, DBQUERYINFO *); int(*dbs_enum_reset)(char **, DBQUERYINFO *);
int(*dbs_enum_end)(char **); int(*dbs_enum_end)(char **);
int(*dbs_start_scan)(void); int(*dbs_start_scan)(void);
@ -92,6 +93,7 @@ DB_FUNCTIONS db_functions[] = {
db_sql_enum_start, db_sql_enum_start,
db_sql_enum_size, db_sql_enum_size,
db_sql_enum_fetch, db_sql_enum_fetch,
db_sql_enum_fetch_row,
db_sql_enum_reset, db_sql_enum_reset,
db_sql_enum_end, db_sql_enum_end,
db_sql_start_scan, db_sql_start_scan,
@ -121,6 +123,7 @@ DB_FUNCTIONS db_functions[] = {
db_sql_enum_start, db_sql_enum_start,
db_sql_enum_size, db_sql_enum_size,
db_sql_enum_fetch, db_sql_enum_fetch,
db_sql_enum_fetch_row,
db_sql_enum_reset, db_sql_enum_reset,
db_sql_enum_end, db_sql_enum_end,
db_sql_start_scan, db_sql_start_scan,
@ -727,6 +730,15 @@ int db_enum_fetch(char **pe, DBQUERYINFO *pinfo, int *size,
} }
/**
* fetch the next item int he result set started by the db enum. this
* will be in native packed row format
*/
int db_enum_fetch_row(char **pe, PACKED_MP3FILE *row, DBQUERYINFO *pinfo) {
return db_current->dbs_enum_fetch_row(pe, row, pinfo);
}
/** /**
* reset the enum, without coming out the the db_writelock * reset the enum, without coming out the the db_writelock
*/ */

View File

@ -125,6 +125,7 @@ typedef struct tag_dbqueryinfo {
int playlist_id; int playlist_id;
int db_id; int db_id;
int session_id; int session_id;
int want_count;
int specifiedtotalcount; int specifiedtotalcount;
int uri_count; int uri_count;
char *uri_sections[10]; char *uri_sections[10];
@ -156,6 +157,7 @@ extern int db_add(char **pe, MP3FILE *pmp3, int *id);
extern int db_enum_start(char **pe, DBQUERYINFO *pinfo); extern int db_enum_start(char **pe, DBQUERYINFO *pinfo);
extern int db_enum_size(char **pe, DBQUERYINFO *pinfo, int *count, int *total_size); extern int db_enum_size(char **pe, DBQUERYINFO *pinfo, int *count, int *total_size);
extern int db_enum_fetch(char **pe, DBQUERYINFO *pinfo, int *size, unsigned char **pdmap); extern int db_enum_fetch(char **pe, DBQUERYINFO *pinfo, int *size, unsigned char **pdmap);
extern int db_enum_fetch_row(char **pe, PACKED_MP3FILE *row, DBQUERYINFO *pinfo);
extern int db_enum_reset(char **pe, DBQUERYINFO *pinfo); extern int db_enum_reset(char **pe, DBQUERYINFO *pinfo);
extern int db_enum_end(char **pe); extern int db_enum_end(char **pe);
extern int db_start_scan(void); extern int db_start_scan(void);

View File

@ -1136,8 +1136,7 @@ int db_sql_enum_start(char **pe, DBQUERYINFO *pinfo) {
DPRINTF(E_DBG,L_DB,"No query/filter\n"); DPRINTF(E_DBG,L_DB,"No query/filter\n");
} }
if((pinfo->index_type != indexTypeNone) || (pinfo->want_count)) {
if(pinfo->index_type != indexTypeNone) {
/* the only time returned count is not specifiedtotalcount /* the only time returned count is not specifiedtotalcount
* is if we have an index. */ * is if we have an index. */
strcpy(scratch,query_count); strcpy(scratch,query_count);
@ -1224,6 +1223,21 @@ int db_sql_enum_size(char **pe, DBQUERYINFO *pinfo, int *count, int *total_size)
} }
/**
* fetch the next row in raw row format
*/
int db_sql_enum_fetch_row(char **pe, PACKED_MP3FILE *row, DBQUERYINFO *pinfo) {
int err;
err=db_sql_enum_fetch_fn(pe, (char***)row);
if(err != DB_E_SUCCESS) {
db_sql_enum_end_fn(NULL);
return err;
}
return DB_E_SUCCESS;
}
/** /**
* fetch the next record from the enum * fetch the next record from the enum
*/ */

View File

@ -39,6 +39,7 @@ extern int db_sql_add(char **pe, MP3FILE *pmp3, int *id);
extern int db_sql_enum_start(char **pe, DBQUERYINFO *pinfo); extern int db_sql_enum_start(char **pe, DBQUERYINFO *pinfo);
extern int db_sql_enum_size(char **pe, DBQUERYINFO *pinfo, int *count, int *total_size); extern int db_sql_enum_size(char **pe, DBQUERYINFO *pinfo, int *count, int *total_size);
extern int db_sql_enum_fetch(char **pe, DBQUERYINFO *pinfo, int *size, unsigned char **pdmap); extern int db_sql_enum_fetch(char **pe, DBQUERYINFO *pinfo, int *size, unsigned char **pdmap);
extern int db_sql_enum_fetch_row(char **pe, PACKED_MP3FILE *row, DBQUERYINFO *pinfo);
extern int db_sql_enum_reset(char **pe, DBQUERYINFO *pinfo); extern int db_sql_enum_reset(char **pe, DBQUERYINFO *pinfo);
extern int db_sql_enum_end(char **pe); extern int db_sql_enum_end(char **pe);
extern int db_sql_start_scan(void); extern int db_sql_start_scan(void);

View File

@ -235,7 +235,7 @@ void daap_handler(WS_CONNINFO *pwsc) {
/* tokenize the uri for easier decoding */ /* tokenize the uri for easier decoding */
string=(pwsc->uri)+1; string=(pwsc->uri)+1;
while((token=strtok_r(string,"/",&save))) { while((pqi->uri_count < 9) && (token=strtok_r(string,"/",&save))) {
string=NULL; string=NULL;
pqi->uri_sections[pqi->uri_count++] = token; pqi->uri_sections[pqi->uri_count++] = token;
} }
@ -737,7 +737,7 @@ char *dispatch_xml_encode(char *original, int len) {
return new; return new;
} }
void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) { void dispatch_stream_id(WS_CONNINFO *pwsc, DBQUERYINFO *pqi, char *id) {
MP3FILE *pmp3; MP3FILE *pmp3;
FILE *file_ptr; FILE *file_ptr;
int file_fd; int file_fd;
@ -753,7 +753,7 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
/* stream out the song */ /* stream out the song */
pwsc->close=1; pwsc->close=1;
item=atoi(pqi->uri_sections[3]); item = atoi(id);
if(ws_getrequestheader(pwsc,"range")) { if(ws_getrequestheader(pwsc,"range")) {
offset=(off_t)atol(ws_getrequestheader(pwsc,"range") + 6); offset=(off_t)atol(ws_getrequestheader(pwsc,"range") + 6);
@ -763,6 +763,7 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
pmp3=db_fetch_item(NULL,item); pmp3=db_fetch_item(NULL,item);
if(!pmp3) { if(!pmp3) {
DPRINTF(E_LOG,L_DAAP|L_WS|L_DB,"Could not find requested item %lu\n",item); DPRINTF(E_LOG,L_DAAP|L_WS|L_DB,"Could not find requested item %lu\n",item);
config_set_status(pwsc,pqi->session_id,NULL);
ws_returnerror(pwsc,404,"File Not Found"); ws_returnerror(pwsc,404,"File Not Found");
} else if (server_side_convert(pmp3->codectype)) { } else if (server_side_convert(pmp3->codectype)) {
/************************ /************************
@ -788,7 +789,6 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
"Thread %d: Error opening %s for conversion\n", "Thread %d: Error opening %s for conversion\n",
pwsc->threadno,pmp3->path); pwsc->threadno,pmp3->path);
ws_returnerror(pwsc,404,"Not found"); ws_returnerror(pwsc,404,"Not found");
config_set_status(pwsc,pqi->session_id,NULL);
db_dispose_item(pmp3); db_dispose_item(pmp3);
} else { } else {
// The type should really be determined by the transcoding // The type should really be determined by the transcoding
@ -949,6 +949,9 @@ void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
// free(pqi); // free(pqi);
} }
void dispatch_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi) {
dispatch_stream_id(pwsc, pqi, pqi->uri_sections[3]);
}
/** /**
* add songs to an existing playlist * add songs to an existing playlist

View File

@ -5,7 +5,10 @@
#ifndef _DISPATCH_H_ #ifndef _DISPATCH_H_
#define _DISPATCH_H_ #define _DISPATCH_H_
#include "db-generic.h"
extern void daap_handler(WS_CONNINFO *pwsc); extern void daap_handler(WS_CONNINFO *pwsc);
extern int daap_auth(char *hostname, char *username, char *password); extern int daap_auth(char *hostname, char *username, char *password);
extern void dispatch_stream_id(WS_CONNINFO *pwsc, DBQUERYINFO *pqi, char *id);
#endif #endif

View File

@ -90,6 +90,17 @@ typedef struct tag_m3ufile {
int index; /**< index of playlist for paths with multiple playlists */ int index; /**< index of playlist for paths with multiple playlists */
} M3UFILE; } M3UFILE;
typedef struct tag_packed_m3ufile {
char *id;
char *title;
char *type;
char *items;
char *query;
char *db_timestamp;
char *path;
char *index;
} PACKED_M3UFILE;
typedef struct tag_packed_mp3file { typedef struct tag_packed_mp3file {
char *id; char *id;
char *path; char *path;

View File

@ -31,9 +31,13 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "conf.h"
#include "db-generic.h"
#include "dispatch.h"
#include "err.h" #include "err.h"
#include "os.h" #include "os.h"
#include "plugin.h" #include "plugin.h"
#include "smart-parser.h"
#include "xml-rpc.h" #include "xml-rpc.h"
#include "webserver.h" #include "webserver.h"
@ -217,8 +221,6 @@ void plugin_url_handle(WS_CONNINFO *pwsc) {
/* so functions must be a tag_plugin_output_fn */ /* so functions must be a tag_plugin_output_fn */
disp_fn=(((PLUGIN_OUTPUT_FN*)ppi->functions)->handler); disp_fn=(((PLUGIN_OUTPUT_FN*)ppi->functions)->handler);
disp_fn(pwsc); disp_fn(pwsc);
ws_returnerror(pwsc,404,"Wtf!");
_plugin_unlock(); _plugin_unlock();
return; return;
} }
@ -263,5 +265,80 @@ void pi_xml_output(XMLSTRUCT *pxml, char *section, char *fmt, ...) {
} }
void pi_xml_deinit(XMLSTRUCT *pxml) { void pi_xml_deinit(XMLSTRUCT *pxml) {
return xml_deinit(pxml); xml_deinit(pxml);
}
char *pi_ws_uri(WS_CONNINFO *pwsc) {
return pwsc->uri;
}
void pi_ws_close(WS_CONNINFO *pwsc) {
pwsc->close=1;
}
void pi_ws_returnerror(WS_CONNINFO *pwsc, int error, char *description) {
ws_returnerror(pwsc,error,description);
}
char *pi_ws_getvar(WS_CONNINFO *pwsc, char *var) {
return ws_getvar(pwsc,var);
}
void pi_log(int level, char *fmt, ...) {
char buf[256];
va_list ap;
va_start(ap,fmt);
vsnprintf(buf,sizeof(buf),fmt,ap);
va_end(ap);
DPRINTF(level,L_PLUG,"%s",buf);
}
char *pi_server_ver(void) {
return VERSION;
}
int pi_server_name(char *name, int *len) {
return conf_get_string("general","servername","unknown",name, len);
}
int pi_db_count(void) {
int count;
db_get_song_count(NULL, &count);
return count;
}
int pi_db_enum_start(char **pe, DBQUERYINFO *pinfo) {
return db_enum_start(pe, pinfo);
}
int pi_db_enum_fetch_row(char **pe, PACKED_MP3FILE *row, DBQUERYINFO *pinfo) {
return db_enum_fetch_row(pe, row, pinfo);
}
int pi_db_enum_end(char **pe) {
return db_enum_end(pe);
}
PARSETREE pi_sp_init(void) {
return sp_init();
}
int pi_sp_parse(PARSETREE tree, char *term) {
return sp_parse(tree,term,0);
}
int pi_sp_dispose(PARSETREE tree) {
return sp_dispose(tree);
}
char *pi_sp_get_error(PARSETREE tree) {
return sp_get_error(tree);
}
void pi_stream(WS_CONNINFO *pwsc, DBQUERYINFO *pqi, char *id) {
dispatch_stream_id(pwsc, pqi,id);
return;
} }