diff options
Diffstat (limited to 'src/client/Client.cpp')
| -rw-r--r-- | src/client/Client.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/client/Client.cpp b/src/client/Client.cpp new file mode 100644 index 0000000..3545414 --- /dev/null +++ b/src/client/Client.cpp @@ -0,0 +1,133 @@ +#include <stdlib.h> +#include <iostream> +#include <sstream> +#include <string> +#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; +} |
