/*
* Copyright 2013-2016 consulo.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package consulo.unity3d.editor;
import java.io.IOException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.google.gson.Gson;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.jezhumble.javasysmon.JavaSysMon;
import com.jezhumble.javasysmon.ProcessInfo;
import consulo.unity3d.run.debugger.UnityProcess;
import consulo.unity3d.run.debugger.UnityProcessDialog;
/**
* @author VISTALL
* @since 17.01.2016
*/
public class UnityEditorCommunication
{
private static final Logger LOGGER = Logger.getInstance(UnityEditorCommunication.class);
@Nullable
public static UnityProcess findEditorProcess()
{
JavaSysMon javaSysMon = new JavaSysMon();
ProcessInfo[] processInfos = javaSysMon.processTable();
UnityProcess unityProcess = null;
for(ProcessInfo processInfo : processInfos)
{
String name = processInfo.getName();
if(name.equalsIgnoreCase("unity.exe") || name.equalsIgnoreCase("unity") || name.equalsIgnoreCase("unity.app"))
{
unityProcess = new UnityProcess(processInfo.getPid(), processInfo.getName(), "localhost", UnityProcessDialog.buildDebuggerPort(processInfo.getPid()));
break;
}
}
return unityProcess;
}
public static boolean request(@NotNull Project project, @NotNull Object postObject, boolean silent)
{
UnityProcess editorProcess = findEditorProcess();
if(editorProcess == null)
{
if(!silent)
{
Messages.showErrorDialog(project, "UnityEditor is not opened", "Consulo");
}
return false;
}
int port = editorProcess.getPort() + 2000;
Gson gson = new Gson();
String urlPart = postObject.getClass().getSimpleName();
HttpPost post = new HttpPost("http://localhost:" + port + "/" + StringUtil.decapitalize(urlPart));
post.setEntity(new StringEntity(gson.toJson(postObject), CharsetToolkit.UTF8_CHARSET));
post.setHeader("Content-Type", "application/json");
CloseableHttpClient client = null;
try
{
int timeOut = 5 * 1000;
RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeOut).setConnectTimeout(timeOut).setSocketTimeout(timeOut).build();
client = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
String data = client.execute(post, httpResponse -> EntityUtils.toString(httpResponse.getEntity(), CharsetToolkit.UTF8_CHARSET));
UnityEditorResponse unityEditorResponse = gson.fromJson(data, UnityEditorResponse.class);
if(!unityEditorResponse.success)
{
if(!silent)
{
Messages.showInfoMessage(project, "Unity cant execute this request", "Consulo");
}
}
return unityEditorResponse.success;
}
catch(IOException e)
{
LOGGER.warn(e);
if(!silent)
{
Messages.showErrorDialog(project, "UnityEditor is not opened", "Consulo");
}
}
finally
{
if(client != null)
{
try
{
client.close();
}
catch(IOException e)
{
//
}
}
}
return false;
}
}