| 2 |
* |
* |
| 3 |
* $Revision$ |
* $Revision$ |
| 4 |
* $Log$ |
* $Log$ |
| 5 |
|
* Revision 1.47 2005/01/22 02:41:14 aga |
| 6 |
|
* ・amazon補完を作成. |
| 7 |
|
* |
| 8 |
* Revision 1.46 2005/01/21 01:36:11 youi |
* Revision 1.46 2005/01/21 01:36:11 youi |
| 9 |
* pubmed補完機能を追加した. |
* pubmed補完機能を追加した. |
| 10 |
* |
* |
| 238 |
#include "index.h" |
#include "index.h" |
| 239 |
#include "changelog.h" |
#include "changelog.h" |
| 240 |
#include "pubmed.h" |
#include "pubmed.h" |
| 241 |
|
#include "amazonbook.h" |
| 242 |
|
|
| 243 |
static string dbprefix; //!< XOOPSデータベーステーブルのPREFIX |
static string dbprefix; //!< XOOPSデータベーステーブルのPREFIX |
| 244 |
|
|
| 5878 |
p.getAbstract( ) ); |
p.getAbstract( ) ); |
| 5879 |
} |
} |
| 5880 |
*/ |
*/ |
| 5881 |
|
|
| 5882 |
|
static void processAsinSearch(xmlTextReaderPtr reader, amazonbook_t* p ) |
| 5883 |
|
{ |
| 5884 |
|
xmlChar* name = NULL; |
| 5885 |
|
xmlChar* value = NULL; |
| 5886 |
|
|
| 5887 |
|
name = xmlTextReaderName(reader); |
| 5888 |
|
if( name == NULL) |
| 5889 |
|
name = xmlStrdup(BAD_CAST "--"); |
| 5890 |
|
value = xmlTextReaderValue(reader); |
| 5891 |
|
|
| 5892 |
|
if( xmlTextReaderNodeType(reader) == XML_READER_TYPE_ELEMENT ){ |
| 5893 |
|
if( strcmp( "Details", (char*)name ) == 0 ){ |
| 5894 |
|
// <Details url="..."> |
| 5895 |
|
xmlChar* val = xmlTextReaderGetAttribute(reader,(xmlChar*)"url"); |
| 5896 |
|
if( val != NULL ){ |
| 5897 |
|
p -> setURL( ( char* )val ); |
| 5898 |
|
xmlFree( val ); |
| 5899 |
|
} |
| 5900 |
|
}else if( strcmp( "ReleaseDate", (char*)name ) == 0 ){ |
| 5901 |
|
// <ReleaseDate>21 June, 2003</ReleaseDate> |
| 5902 |
|
// コンマで区切り、2個目をsscanf(%d)する。 |
| 5903 |
|
xmlChar* val = getChildText( reader ); |
| 5904 |
|
if ( val != NULL ){ |
| 5905 |
|
char *q = strchr( (char *)val, ',' ); |
| 5906 |
|
if ( q != NULL ){ |
| 5907 |
|
int year; |
| 5908 |
|
if ( sscanf( q+1, "%d", &year ) == 1 ) |
| 5909 |
|
p -> setYearOfPublication( year ); |
| 5910 |
|
} |
| 5911 |
|
xmlFree( val ); |
| 5912 |
|
} |
| 5913 |
|
}else if( strcmp( "Author", (char*)name ) == 0 ){ |
| 5914 |
|
xmlChar* val = getChildText( reader ); |
| 5915 |
|
if ( val != NULL ){ |
| 5916 |
|
// Authorを\n区切りで追加する。 |
| 5917 |
|
string s( p -> getAuthor() ); |
| 5918 |
|
if ( s.length() == 0 ){ |
| 5919 |
|
p -> setAuthor( (char*)val ); |
| 5920 |
|
} |
| 5921 |
|
else { |
| 5922 |
|
s = s + "\n" + (char *)val; |
| 5923 |
|
p -> setAuthor( s.c_str() ); |
| 5924 |
|
} |
| 5925 |
|
xmlFree( val ); |
| 5926 |
|
} |
| 5927 |
|
}else if( strcmp( "Asin", (char*)name ) == 0 ){ |
| 5928 |
|
xmlChar* val = getChildText( reader ); |
| 5929 |
|
p -> setISBN( ( char* )val ); |
| 5930 |
|
if( val != NULL ) xmlFree( val ); |
| 5931 |
|
}else if( strcmp( "ProductName", (char*)name ) == 0 ){ |
| 5932 |
|
xmlChar* val = getChildText( reader ); |
| 5933 |
|
p -> setTitle( ( char* )val ); |
| 5934 |
|
if( val != NULL ) xmlFree( val ); |
| 5935 |
|
}else if( strcmp( "Manufacturer", (char*)name ) == 0 ){ |
| 5936 |
|
xmlChar* val = getChildText( reader ); |
| 5937 |
|
p -> setPublisher( ( char* )val ); |
| 5938 |
|
if( val != NULL ) xmlFree( val ); |
| 5939 |
|
} |
| 5940 |
|
} |
| 5941 |
|
xmlFree(name); |
| 5942 |
|
|
| 5943 |
|
if( value != NULL) xmlFree(value); |
| 5944 |
|
} |
| 5945 |
|
|
| 5946 |
|
static int streamAmazonBookFile(const char *filename, amazonbook_t* p) |
| 5947 |
|
{ |
| 5948 |
|
xmlTextReaderPtr reader; |
| 5949 |
|
int ret; |
| 5950 |
|
|
| 5951 |
|
reader = xmlNewTextReaderFilename(filename); |
| 5952 |
|
if( reader != NULL ){ |
| 5953 |
|
ret = xmlTextReaderRead(reader); |
| 5954 |
|
while( ret == 1 ){ |
| 5955 |
|
processAsinSearch(reader, p); |
| 5956 |
|
ret = xmlTextReaderRead(reader); |
| 5957 |
|
} |
| 5958 |
|
xmlFreeTextReader(reader); |
| 5959 |
|
if( ret != 0 ){ |
| 5960 |
|
//printf("%s : failed to parse\n", filename); |
| 5961 |
|
} |
| 5962 |
|
}else{ |
| 5963 |
|
ret = -1; |
| 5964 |
|
//printf("Unable to open %s\n", filename); |
| 5965 |
|
} |
| 5966 |
|
xmlErrorPtr err = xmlGetLastError(); |
| 5967 |
|
if( err != NULL ){ |
| 5968 |
|
setLastErrorString( err -> message ); |
| 5969 |
|
} |
| 5970 |
|
return ret; |
| 5971 |
|
} |
| 5972 |
|
|
| 5973 |
|
/** |
| 5974 |
|
* @param url amazonのASIN Searchの結果のURL. |
| 5975 |
|
* ex.:http://xml.amazon.com/onca/xml3?t=chararina-22&dev-t=0H8BRF5MB0Z590ZPWA82&type=lite&f=xml&AsinSearch=081297106X |
| 5976 |
|
* @param amazonbook 結果を書き込むamazonbook_tのポインタ引数 |
| 5977 |
|
*/ |
| 5978 |
|
result_t amazonComplete( const char *url, const amazonbook_t** amazonbook ) |
| 5979 |
|
{ |
| 5980 |
|
result_t ret = RES_ERROR; |
| 5981 |
|
*amazonbook = new amazonbook_t[1]; |
| 5982 |
|
if( streamAmazonBookFile( url, (amazonbook_t *)*amazonbook ) == 0 ) ret = RES_OK; |
| 5983 |
|
return ret; |
| 5984 |
|
} |
| 5985 |
|
|