paulo@0: /* paulo@0: * $Id: gt_share_file.c,v 1.17 2003/07/23 18:43:32 hipnod Exp $ paulo@0: * paulo@0: * Copyright (C) 2001-2003 giFT project (gift.sourceforge.net) paulo@0: * paulo@0: * This program is free software; you can redistribute it and/or modify it paulo@0: * under the terms of the GNU General Public License as published by the paulo@0: * Free Software Foundation; either version 2, or (at your option) any paulo@0: * later version. paulo@0: * paulo@0: * This program is distributed in the hope that it will be useful, but paulo@0: * WITHOUT ANY WARRANTY; without even the implied warranty of paulo@0: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU paulo@0: * General Public License for more details. paulo@0: */ paulo@0: paulo@0: #include "gt_gnutella.h" paulo@0: paulo@0: #include "sha1.h" paulo@0: #if 0 paulo@0: #include "src/mime.h" paulo@0: #endif paulo@0: paulo@0: #include "gt_share_file.h" paulo@0: #include "gt_query_route.h" paulo@0: paulo@0: #include "gt_search.h" paulo@0: #include "gt_search_exec.h" paulo@0: paulo@0: /******************************************************************************/ paulo@0: paulo@0: unsigned int gt_share_unref (Share *file) paulo@0: { paulo@0: GtShare *share; paulo@0: paulo@0: if ((share = share_get_udata (file, GT->name))) paulo@0: { paulo@0: if (file->ref <= 1) paulo@0: { paulo@0: gt_share_free_data (file, share); paulo@0: share_set_udata (file, GT->name, NULL); paulo@0: } paulo@0: } paulo@0: paulo@0: return share_unref (file); paulo@0: } paulo@0: paulo@0: unsigned int gt_share_ref (Share *file) paulo@0: { paulo@0: return share_ref (file); paulo@0: } paulo@0: paulo@0: /******************************************************************************/ paulo@0: paulo@0: /* this is duplicated with tokenize in gt_query_route.c for the time being */ paulo@0: GtTokenSet *gt_share_tokenize (char *hpath) paulo@0: { paulo@0: GtTokenSet *token_set; paulo@0: char *str; paulo@0: char *str0; paulo@0: char *next; paulo@0: paulo@0: if (!(str0 = str = STRDUP (hpath))) paulo@0: return NULL; paulo@0: paulo@0: if (!(token_set = gt_token_set_new ())) paulo@0: { paulo@0: free (str0); paulo@0: return NULL; paulo@0: } paulo@0: paulo@0: while ((next = string_sep_set (&str, QRP_DELIMITERS)) != NULL) paulo@0: { paulo@0: uint32_t tok; paulo@0: paulo@0: if (string_isempty (next)) paulo@0: continue; paulo@0: paulo@0: tok = gt_query_router_hash_str (next, 32); paulo@0: gt_token_set_append (token_set, tok); paulo@0: } paulo@0: paulo@0: free (str0); paulo@0: return token_set; paulo@0: } paulo@0: paulo@0: /******************************************************************************/ paulo@0: paulo@0: GtShare *gt_share_new_data (Share *file, uint32_t index) paulo@0: { paulo@0: GtShare *share; paulo@0: char *basename; paulo@0: paulo@0: if (!file) paulo@0: return NULL; paulo@0: paulo@0: if (!(share = malloc (sizeof (GtShare)))) paulo@0: return NULL; paulo@0: paulo@0: assert (SHARE_DATA(file) != NULL); paulo@0: paulo@0: if (!(basename = file_basename (SHARE_DATA(file)->path))) paulo@0: { paulo@0: GT->DBGFN (GT, "bad basename for %s", SHARE_DATA(file)->path); paulo@0: free (share); paulo@0: return NULL; paulo@0: } paulo@0: paulo@0: share->index = index; paulo@0: share->filename = basename; /* share mem with Share */ paulo@0: share->tokens = gt_share_tokenize (share_get_hpath (file)); paulo@0: paulo@0: return share; paulo@0: } paulo@0: paulo@0: void gt_share_free_data (Share *file, GtShare *share) paulo@0: { paulo@0: if (!file) paulo@0: { paulo@0: assert (share != NULL); paulo@0: return; paulo@0: } paulo@0: paulo@0: if (!share) paulo@0: return; paulo@0: paulo@0: gt_token_set_free (share->tokens); paulo@0: paulo@0: /* don't free share->filename */ paulo@0: paulo@0: free (share); paulo@0: } paulo@0: paulo@0: Share *gt_share_new (char *filename, uint32_t index, off_t size, paulo@0: unsigned char *sha1) paulo@0: { paulo@0: Share *file; paulo@0: GtShare *share; paulo@0: #if 0 paulo@0: char *mime; paulo@0: paulo@0: /* choose mime type based on extension */ paulo@0: mime = mime_type (filename); paulo@0: #endif paulo@0: paulo@0: /* TODO: parse path out of filename. Nodes don't put paths in the paulo@0: * search result string yet but may in the future */ paulo@0: if (!(file = share_new (filename))) paulo@0: return NULL; paulo@0: paulo@0: #if 0 paulo@0: share_set_mime (file, mime); paulo@0: #endif paulo@0: paulo@0: file->size = size; paulo@0: paulo@0: /* paulo@0: * Set the hash if it was passed in, but also accept a null hash paulo@0: * TODO: need a generic urn: type to stop hardcoding sha1 paulo@0: */ paulo@0: if (sha1 && !share_set_hash (file, "SHA1", sha1, SHA1_BINSIZE, TRUE)) paulo@0: { paulo@0: gt_share_unref (file); paulo@0: return NULL; paulo@0: } paulo@0: paulo@0: if (!(share = gt_share_new_data (file, index))) paulo@0: { paulo@0: gt_share_unref (file); paulo@0: return NULL; paulo@0: } paulo@0: paulo@0: share_set_udata (file, GT->name, share); paulo@0: paulo@0: return file; paulo@0: } paulo@0: paulo@0: void gt_share_free (Share *file) paulo@0: { paulo@0: gt_share_free_data (file, share_get_udata (file, GT->name)); paulo@0: share_set_udata (file, GT->name, NULL); paulo@0: paulo@0: share_free (file); paulo@0: }