#include #include #include #include #include "Config.h" #include "Client.h" #include "interface/Point.h" #include "Graphics.h" /* static Thumbnail* thumbnailCache[120]; static void * activeThumbRequests[5]; static int activeThumbRequestTimes[5]; static std::string activeThumbRequestIDs[5]; */ Client::Client() { int i = 0; http_init(NULL); for(i = 0; i < 120; i++) { thumbnailCache[i] = NULL; } for(i = 0; i < 5; i++) { activeThumbRequests[i] = NULL; activeThumbRequestTimes[i] = 0; } } Client::~Client() { http_done(); } void Client::ClearThumbnailRequests() { for(int i = 0; i < 5; i++) { if(activeThumbRequests[i]) { http_async_req_close(activeThumbRequests[i]); activeThumbRequests[i] = NULL; } } } Thumbnail * Client::GetThumbnail(int saveID, int saveDate) { std::stringstream urlStream; std::stringstream idStream; int i = 0; for(i = 0; i < 120; i++) { if(thumbnailCache[i] && thumbnailCache[i]->ID == saveID && thumbnailCache[i]->Datestamp == saveDate) return thumbnailCache[i]; } urlStream << "http://" << SERVER << "/Get.api?Op=thumbsmall&ID=" << saveID; if(saveDate) { urlStream << "&Date=" << saveDate; } idStream << saveID << ":" << saveDate; std::string idString = idStream.str(); bool found = false; for(i = 0; i < 5; i++) { if(activeThumbRequests[i] && activeThumbRequestIDs[i] == idString) { found = true; if(http_async_req_status(activeThumbRequests[i])) { pixel * thumbData; char * data; int status, data_size, imgw, imgh; data = http_async_req_stop(activeThumbRequests[i], &status, &data_size); activeThumbRequests[i] = NULL; if (status == 200 && data) { thumbData = Graphics::ptif_unpack(data, data_size, &imgw, &imgh); if(data) { free(data); } thumbnailCacheNextID %= 120; if(thumbnailCache[thumbnailCacheNextID]) { delete thumbnailCache[thumbnailCacheNextID]; } if(thumbData) { thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, thumbData, ui::Point(imgw, imgh)); } else { thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128)); } return thumbnailCache[thumbnailCacheNextID++]; } else { if(data) { free(data); } thumbnailCacheNextID %= 120; if(thumbnailCache[thumbnailCacheNextID]) { delete thumbnailCache[thumbnailCacheNextID]; } thumbnailCache[thumbnailCacheNextID] = new Thumbnail(saveID, saveDate, (pixel *)malloc((128*128) * PIXELSIZE), ui::Point(128, 128)); return thumbnailCache[thumbnailCacheNextID++]; } } } } if(!found) { for(i = 0; i < 5; i++) { if(!activeThumbRequests[i]) { activeThumbRequests[i] = http_async_req_start(NULL, (char *)urlStream.str().c_str(), NULL, 0, 1); std::cout << "ThumbCache: Requesting " << urlStream.str() << " : " << idString << std::endl; activeThumbRequestIDs[i] = idString; return NULL; } } } //http_async_req_start(http, urlStream.str().c_str(), NULL, 0, 1); return NULL; }