13854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt/* 23854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt * Copyright 2016 Google Inc. 33854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt * 43854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt * Use of this source code is governed by a BSD-style license that can be 53854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt * found in the LICENSE file. 63854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt */ 73854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 83854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt#include "UrlHandler.h" 93854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 103854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt#include "microhttpd.h" 113854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt#include "../Request.h" 123854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt#include "../Response.h" 133854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 143854f11ce35857ccb6dbf8bb09bef9252543090fjoshualittusing namespace Response; 153854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 163854f11ce35857ccb6dbf8bb09bef9252543090fjoshualittbool EnableGPUHandler::canHandle(const char* method, const char* url) { 173854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt static const char* kBasePath = "/enableGPU/"; 183854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt return 0 == strcmp(method, MHD_HTTP_METHOD_POST) && 193854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 0 == strncmp(url, kBasePath, strlen(kBasePath)); 203854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt} 213854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 223854f11ce35857ccb6dbf8bb09bef9252543090fjoshualittint EnableGPUHandler::handle(Request* request, MHD_Connection* connection, 233854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt const char* url, const char* method, 243854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt const char* upload_data, size_t* upload_data_size) { 253854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt SkTArray<SkString> commands; 263854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt SkStrSplit(url, "/", &commands); 273854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 283854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt if (commands.count() != 2) { 293854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt return MHD_NO; 303854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt } 313854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 323854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt int enable; 333854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt sscanf(commands[1].c_str(), "%d", &enable); 343854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 353854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt if (enable) { 363854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt SkSurface* surface = request->createGPUSurface(); 373854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt if (surface) { 383854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt request->fSurface.reset(surface); 393854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt request->fGPUEnabled = true; 403854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt return SendOK(connection); 413854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt } 423854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt return SendError(connection, "Unable to create GPU surface"); 433854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt } 443854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt request->fSurface.reset(request->createCPUSurface()); 453854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt request->fGPUEnabled = false; 463854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt return SendOK(connection); 473854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt} 483854f11ce35857ccb6dbf8bb09bef9252543090fjoshualitt 49