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