00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00035 #include <string.h>
00036 #include <unistd.h>
00037
00038 #ifdef __WIN32__
00039 #include <conio.h>
00040 #include <winsock.h>
00041 #else
00042 #include <netdb.h>
00043 #include <sys/socket.h>
00044 #include <netinet/in.h>
00045 #endif
00046
00047 #include "splt.h"
00048 #include "socket_manager.h"
00049 #include "freedb.h"
00050
00051 #define DONT_SKIP_LINES 0
00052 #define SKIP_ONE_LINE 1
00053
00054 #if defined(__BEOS__) && !defined (HAS_GETPASS)
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #endif
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 char *get_cgi_path_and_cut_server(int type, const char *search_server)
00191 {
00192 char *cgi_path = NULL;
00193
00194 if (strlen(search_server) == 0)
00195 {
00196 splt_su_copy("/~cddb/cddb.cgi", &cgi_path);
00197 return cgi_path;
00198 }
00199
00200 if (type == SPLT_FREEDB_SEARCH_TYPE_CDDB_CGI ||
00201 type == SPLT_FREEDB_GET_FILE_TYPE_CDDB_CGI)
00202 {
00203 char *path = strchr(search_server,'/');
00204 if (path)
00205 {
00206 splt_su_copy(path, &cgi_path);
00207 *path = '\0';
00208 }
00209 }
00210
00211 return cgi_path;
00212 }
00213
00214 static char *splt_freedb_get_server(const char search_server[256])
00215 {
00216 char *server = NULL;
00217
00218 if (strlen(search_server) == 0)
00219 {
00220 splt_su_copy(SPLT_FREEDB2_SITE, &server);
00221 }
00222 else
00223 {
00224 splt_su_copy(search_server, &server);
00225 }
00226
00227 return server;
00228 }
00229
00230 static int splt_freedb_get_port(int port_number)
00231 {
00232 if (port_number == -1)
00233 {
00234 return SPLT_FREEDB_CDDB_CGI_PORT;
00235 }
00236
00237 return port_number;
00238 }
00239
00240
00241 static int splt_freedb_search_result_processor(const char *line,
00242 int line_number, void *user_data)
00243 {
00244 char *category = NULL;
00245 char *discid = NULL;
00246
00247 splt_state *state = (splt_state *) user_data;
00248
00249 const char *category_begin = splt_su_skip_spaces(line);
00250 const char *category_end = strchr(category_begin, ' ');
00251 if (category_end == NULL) { goto end; }
00252 splt_su_append(&category, category_begin, category_end - category_begin + 1, NULL);
00253
00254 const char *discid_begin = splt_su_skip_spaces(category_end);
00255 const char *discid_end = strchr(discid_begin, ' ');
00256 if (discid_end == NULL) { goto end; }
00257 splt_su_append(&discid, discid_begin, discid_end - discid_begin + 1, NULL);
00258
00259 splt_fu_freedb_set_disc(state, splt_fu_freedb_get_found_cds(state),
00260 discid, category, strlen(category));
00261
00262 splt_fu_freedb_append_result(state, splt_su_skip_spaces(discid_end), 0);
00263
00264 splt_fu_freedb_found_cds_next(state);
00265
00266 end:
00267 if (category)
00268 {
00269 free(category);
00270 category = NULL;
00271 }
00272 if (discid)
00273 {
00274 free(discid);
00275 discid = NULL;
00276 }
00277
00278 return SPLT_TRUE;
00279 }
00280
00293 int splt_freedb_process_search(splt_state *state, char *search,
00294 int search_type, const char search_server[256],
00295 int port_number)
00296 {
00297 int error = SPLT_FREEDB_OK;
00298 int err = SPLT_OK;
00299 char *message = NULL;
00300
00301 splt_socket_handler *sh = splt_sm_socket_handler_new(&error);
00302 if (error < 0) { return error; }
00303
00304 char *cgi_path = get_cgi_path_and_cut_server(search_type, search_server);
00305 char *server = splt_freedb_get_server(search_server);
00306 int port = splt_freedb_get_port(port_number);
00307
00308 splt_sm_connect(sh, server, port, state);
00309 if (sh->error < 0) { error = sh->error; goto end; }
00310
00311 if (search_type == SPLT_FREEDB_SEARCH_TYPE_CDDB_CGI)
00312 {
00313 splt_su_replace_all_char(search, ' ', '+');
00314 err = splt_su_append_str(&message,
00315 "GET ", cgi_path, "?cmd=cddb+album+", search, SPLT_FREEDB_HELLO_PROTO, NULL);
00316 if (err < 0) { error = err; goto disconnect; }
00317
00318 splt_sm_send_http_message(sh, message, state);
00319 if (sh->error < 0) { error = sh->error; goto disconnect; }
00320
00321 splt_fu_freedb_free_search(state);
00322 err = splt_fu_freedb_init_search(state);
00323 if (err < 0) { error = err; goto disconnect; }
00324
00325 splt_sm_receive_and_process_without_headers(sh, state,
00326 splt_freedb_search_result_processor, state, SKIP_ONE_LINE);
00327 if (sh->error < 0) { error = sh->error; goto disconnect; }
00328 }
00329 else if (search_type == SPLT_FREEDB_SEARCH_TYPE_CDDB)
00330 {
00331
00332 }
00333
00334 int found_cds = splt_fu_freedb_get_found_cds(state);
00335 if (found_cds == 0)
00336 {
00337 error = SPLT_FREEDB_NO_CD_FOUND;
00338 }
00339 else if (found_cds == -1)
00340 {
00341 splt_e_set_error_data(state, server);
00342 error = SPLT_FREEDB_ERROR_GETTING_INFOS;
00343 }
00344 else if (found_cds == SPLT_MAXCD)
00345 {
00346 error = SPLT_FREEDB_MAX_CD_REACHED;
00347 }
00348
00349 disconnect:
00350 splt_sm_close(sh, state);
00351 if (sh->error < 0) { error = sh->error; goto end; }
00352
00353 end:
00354 splt_sm_socket_handler_free(&sh);
00355
00356 if (cgi_path)
00357 {
00358 free(cgi_path);
00359 cgi_path = NULL;
00360 }
00361 if (server)
00362 {
00363 free(server);
00364 server = NULL;
00365 }
00366 if (message)
00367 {
00368 free(message);
00369 message = NULL;
00370 }
00371
00372 return error;
00373 }
00374
00375 static int splt_freedb_process_hello_response(const char *line,
00376 int line_number, void *user_data)
00377 {
00378 int *error = (int *) user_data;
00379
00380 if ((strncmp(line,"50",2) == 0) ||
00381 (strncmp(line,"40",2) == 0))
00382 {
00383 if (strncmp(line,"401",3) == 0)
00384 {
00385 *error = SPLT_FREEDB_NO_SUCH_CD_IN_DATABASE;
00386 }
00387 else
00388 {
00389 *error = SPLT_FREEDB_ERROR_SITE;
00390 }
00391 }
00392
00393 return SPLT_FALSE;
00394 }
00395
00396 char *test = NULL;
00397
00398 static int splt_freedb_process_get_file(const char *line,
00399 int line_number, void *user_data)
00400 {
00401 splt_get_file *get_file = (splt_get_file *) user_data;
00402
00403 if (line_number == 1)
00404 {
00405 if ((strncmp(line,"50",2) == 0) ||
00406 (strncmp(line,"40",2) == 0))
00407 {
00408 if (strncmp(line,"401",3) == 0)
00409 {
00410 get_file->err= SPLT_FREEDB_NO_SUCH_CD_IN_DATABASE;
00411 }
00412 else
00413 {
00414 get_file->err = SPLT_FREEDB_ERROR_SITE;
00415 }
00416
00417 return SPLT_FALSE;
00418 }
00419
00420 return SPLT_TRUE;
00421 }
00422
00423 if (get_file->stop_on_dot && strcmp(line, ".") == 0)
00424 {
00425 return SPLT_FALSE;
00426 }
00427
00428 int err = splt_su_append_str(&get_file->file, line, "\n", NULL);
00429 if (err < 0)
00430 {
00431 get_file->err = err;
00432 return SPLT_FALSE;
00433 }
00434
00435 return SPLT_TRUE;
00436 }
00437
00438
00456 char *splt_freedb_get_file(splt_state *state, int disc_id, int *error,
00457 int get_type, const char cddb_get_server[256], int port_number)
00458 {
00459 int err = SPLT_FREEDB_FILE_OK;
00460 *error = err;
00461 char *message = NULL;
00462
00463 splt_socket_handler *sh = splt_sm_socket_handler_new(&err);
00464 if (err < 0) { *error = err; return NULL; }
00465
00466 splt_get_file *get_file = malloc(sizeof(splt_get_file));
00467 if (!get_file) { *error = SPLT_ERROR_CANNOT_ALLOCATE_MEMORY; return NULL; }
00468
00469 get_file->err = SPLT_FREEDB_FILE_OK;
00470 get_file->file = NULL;
00471 get_file->stop_on_dot = SPLT_FALSE;
00472
00473 char *cgi_path = get_cgi_path_and_cut_server(get_type, cddb_get_server);
00474 char *server = splt_freedb_get_server(cddb_get_server);
00475 int port = splt_freedb_get_port(port_number);
00476
00477 const char *cd_category = splt_fu_freedb_get_disc_category(state, disc_id);
00478 const char *cd_id = splt_fu_freedb_get_disc_id(state, disc_id);
00479
00480 splt_sm_connect(sh, server, port, state);
00481 if (sh->error < 0) { *error = sh->error; goto end; }
00482
00483 if (get_type == SPLT_FREEDB_GET_FILE_TYPE_CDDB_CGI)
00484 {
00485 message = splt_su_get_formatted_message(state,
00486 SPLT_FREEDB_CDDB_CGI_GET_FILE, cgi_path, cd_category, cd_id, NULL);
00487
00488 splt_sm_send_http_message(sh, message, state);
00489 if (sh->error < 0) { *error = sh->error; goto disconnect; }
00490
00491 splt_sm_receive_and_process_without_headers(sh, state,
00492 splt_freedb_process_get_file, get_file, DONT_SKIP_LINES);
00493 if (get_file->err < 0) { *error = get_file->err; goto disconnect; }
00494 if (sh->error < 0) { *error = sh->error; goto disconnect; }
00495 }
00496 else if (get_type == SPLT_FREEDB_GET_FILE_TYPE_CDDB)
00497 {
00498 get_file->stop_on_dot = SPLT_TRUE;
00499
00500 splt_sm_send_http_message(sh, SPLT_FREEDB_HELLO, state);
00501 if (sh->error < 0) { *error = sh->error; goto disconnect; }
00502
00503 splt_sm_receive_and_process(sh, state, splt_freedb_process_hello_response, &err);
00504 if (err < 0) { *error = err; goto disconnect; }
00505 if (sh->error < 0) { *error = sh->error; goto disconnect; }
00506
00507 message = splt_su_get_formatted_message(state, SPLT_FREEDB_GET_FILE,
00508 cd_category, cd_id, NULL);
00509
00510 splt_sm_send_http_message(sh, message, state);
00511 if (sh->error < 0) { *error = sh->error; goto disconnect; }
00512
00513 splt_sm_receive_and_process(sh, state, splt_freedb_process_get_file, get_file);
00514 if (get_file->err < 0) { *error = get_file->err; goto disconnect; }
00515 if (sh->error < 0) { *error = sh->error; goto disconnect; }
00516 }
00517
00518 disconnect:
00519 splt_sm_close(sh, state);
00520 if (sh->error < 0) { *error = sh->error; goto end; }
00521
00522 end:
00523 splt_sm_socket_handler_free(&sh);
00524
00525 if (cgi_path)
00526 {
00527 free(cgi_path);
00528 cgi_path = NULL;
00529 }
00530 if (server)
00531 {
00532 free(server);
00533 server = NULL;
00534 }
00535 if (message)
00536 {
00537 free(message);
00538 message = NULL;
00539 }
00540
00541 if (get_file)
00542 {
00543 char *file = get_file->file;
00544
00545 free(get_file);
00546 get_file = NULL;
00547
00548 return file;
00549 }
00550
00551 return NULL;
00552 }
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611