Advertisement
Guest User

Untitled

a guest
Sep 8th, 2015
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.83 KB | None | 0 0
  1. CPP:
  2. #include "AtecConnectPluginPrivatePCH.h"
  3. #include "AtecConnectLibrary.h"
  4. #include "Engine.h"
  5. FSocket* Socket;
  6. int32 BufferSize;
  7. bool connected;
  8. FString API_KEY;
  9. FString PROJECT_ID;
  10. UAtecConnectLibrary::UAtecConnectLibrary(const FObjectInitializer& ObjectInitializer)
  11. : Super(ObjectInitializer)
  12. {
  13.  
  14. }
  15.  
  16. UAtecConnectLibrary* UAtecConnectLibrary::MakeAtecConnect(UObject* WorldContextObject)
  17. {
  18. return NewObject<UAtecConnectLibrary>();
  19. }
  20.  
  21. int32 UAtecConnectLibrary::ConnectToServer(FString APIKEY, FString PROJECTID, FString IP)
  22. {
  23. StartTCP("RamaSocketListener", IP, APIKEY, PROJECTID, 8890);
  24.  
  25.  
  26. return 12;
  27. }
  28.  
  29. void UAtecConnectLibrary::Test()
  30. {
  31. GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Green, TEXT("TEST"));
  32. }
  33.  
  34. void UAtecConnectLibrary::GetGameServers()
  35. {
  36. //OnRecieveServersDelegate.AddDynamic(this, &UAtecConnectLibrary::Test);
  37. FServerStruct test;
  38. test.IP = TEXT("13123123123");
  39. test.PORT = TEXT("13123123123");
  40. SendTCP("GET_GAMESERVERS|API_KEY=" + API_KEY + ";PROJECT_ID=" + PROJECT_ID+";");
  41.  
  42.  
  43. TestDelegate.Broadcast(); // <<<<<<< -----------------------------
  44.  
  45.  
  46. if (TestDelegate.IsBound())
  47.  
  48. {
  49. GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Green, TEXT("BOUND"));
  50. }
  51. else
  52. {
  53. GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Green, TEXT("NOT BOUND"));
  54. }
  55.  
  56. }
  57.  
  58. bool UAtecConnectLibrary::StartTCP(
  59. const FString& YourChosenSocketName,
  60. const FString& TheIP,
  61. const FString APIKEY, const FString PROJECTID,
  62. const int32 ThePort
  63. )
  64. {
  65. Socket =
  66. ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateSocket(NAME_Stream, TEXT("default"), false);
  67.  
  68. API_KEY = APIKEY;
  69. PROJECT_ID = PROJECTID;
  70.  
  71.  
  72.  
  73. FString address = TEXT("127.0.0.1");
  74. int32 port = 7000;
  75. FIPv4Address ip;
  76. FIPv4Address::Parse(address, ip);
  77.  
  78. TSharedRef<FInternetAddr> addr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
  79. addr->SetIp(ip.GetValue());
  80. addr->SetPort(port);
  81.  
  82. connected = Socket->Connect(*addr);
  83.  
  84. BufferSize = 1024;
  85. Socket->SetSendBufferSize(BufferSize, BufferSize);
  86. Socket->SetReceiveBufferSize(BufferSize, BufferSize);
  87. Socket->SetNonBlocking(true);
  88.  
  89. GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, TEXT("SENDING CONNECTION STRING!"));
  90.  
  91. if (connected)
  92. {
  93. GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, TEXT("CONNECTED!"));
  94. SendTCP("GAME_CONNECTED|API_KEY=" + API_KEY + ";PROJECT_ID=" + PROJECT_ID + ";");
  95. }
  96. return connected;
  97. }
  98.  
  99. bool UAtecConnectLibrary::SendTCP(FString Message)
  100. {
  101. FString serialized = Message;
  102. TCHAR *serializedChar = serialized.GetCharArray().GetData();
  103. int32 size = FCString::Strlen(serializedChar);
  104. int32 sent = 0;
  105. bool successful = Socket->Send((uint8*)TCHAR_TO_UTF8(serializedChar), size, sent);
  106. return successful;
  107. }
  108. void UAtecConnectLibrary::RecieveLoop()
  109. {
  110. TArray<uint8> ReceivedData;
  111. TSharedRef<FInternetAddr> ReceivedAddr =
  112. ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
  113.  
  114. uint32 Size;
  115. bool bIsDataReceived = false;
  116.  
  117. if (Socket->HasPendingData(Size))
  118. {
  119. ReceivedData.Init(FMath::Min(Size, 65507u));
  120.  
  121. int32 Read = 0;
  122. Socket->RecvFrom(ReceivedData.GetData(), BufferSize, Read, *ReceivedAddr);
  123.  
  124. if (Read > 0)
  125. {
  126. FString ConvertedData = StringFromBinaryArray(ReceivedData);
  127. bIsDataReceived = true;
  128. //FString ID = GetParameterFromString(ConvertedData , "ID");
  129. GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Green, ConvertedData);
  130. FString COMMAND = GetCommandFromString(ConvertedData);
  131. RecieveSwitch(ConvertedData);
  132.  
  133. }
  134. }
  135. }
  136.  
  137. void UAtecConnectLibrary::RecieveSwitch(FString Data)
  138. {
  139. if (GetCommandFromString(Data) == TEXT("GET_SEVERS"))
  140. {
  141. TArray<FString> OBJECTS = GetArrayFromString(Data, "servers", "SERVER");
  142. TArray<FServerStruct> Servers;
  143. for (int i = 0; i < OBJECTS.Num(); i++)
  144. {
  145. FServerStruct ServerToAdd;
  146. ServerToAdd.IP = GetParameterFromString(OBJECTS[i], TEXT("IP"));
  147. ServerToAdd.PORT = GetParameterFromString(OBJECTS[i], TEXT("PORT"));
  148.  
  149.  
  150.  
  151.  
  152. }
  153.  
  154.  
  155.  
  156. }
  157. }
  158.  
  159. FString UAtecConnectLibrary::StringFromBinaryArray(const TArray<uint8>& BinaryArray)
  160. {
  161. //Create a string from a byte array!
  162. std::string cstr(reinterpret_cast<const char*>(BinaryArray.GetData()), BinaryArray.Num());
  163.  
  164. return FString(cstr.c_str());
  165. }
  166.  
  167. FString UAtecConnectLibrary::GetCommandFromString(FString raw)
  168. {
  169. FString commandReturn = "SEARCH_FAILED";
  170. FString val = "";
  171.  
  172. commandReturn = raw.Mid(0, raw.Find((TEXT("|"))));
  173.  
  174. if (val != TEXT(""))
  175. {
  176. commandReturn = val;
  177. }
  178.  
  179. return commandReturn;
  180. }
  181.  
  182. FString UAtecConnectLibrary::GetParameterFromString(FString raw, FString toSearch)
  183. {
  184. int32 KeyPostion;
  185.  
  186. int32 ValuePosition;
  187. FString Value = "SEARCH_FAILED";
  188.  
  189. int32 EndPostion;
  190.  
  191. bool IsArray;
  192. bool IsObject;
  193.  
  194. KeyPostion = raw.Find(toSearch);
  195. ValuePosition = raw.Find("=",ESearchCase::IgnoreCase,ESearchDir::FromStart,KeyPostion + toSearch.Len());
  196.  
  197. IsArray = raw.Contains("[");
  198. IsObject = raw.Contains("{");
  199.  
  200.  
  201. if (IsArray)
  202. {
  203. int32 ClosingBracket;
  204. ClosingBracket = raw.Find("]");
  205. if (ClosingBracket == -1)
  206. {
  207. return "NO_CLOSING_BRACKET";
  208.  
  209. }
  210.  
  211. EndPostion = raw.Find(";", ESearchCase::IgnoreCase, ESearchDir::FromStart, ClosingBracket);
  212. if (EndPostion == -1)
  213. {
  214.  
  215. return "NO_CLOSING_SEMICOLON";
  216. }
  217. }
  218. else if (IsObject)
  219. {
  220. int32 ClosingBracket;
  221. ClosingBracket = raw.Find("}");
  222. if (ClosingBracket == -1)
  223. {
  224. return "NO_CLOSING_BRACKET";
  225. }
  226.  
  227. EndPostion = raw.Find(";", ESearchCase::IgnoreCase, ESearchDir::FromStart, ClosingBracket);
  228. if (EndPostion == -1)
  229. {
  230.  
  231. return "NO_CLOSING_SEMICOLON";
  232. }
  233. }
  234. else
  235. {
  236. EndPostion = raw.Find(";");
  237. if (EndPostion == -1)
  238. {
  239. return "NO_CLOSING_SEMICOLON";
  240. }
  241. }
  242.  
  243. Value = raw.Mid(ValuePosition + 1, EndPostion - ValuePosition -1);
  244.  
  245. return Value;
  246. }
  247.  
  248. TArray<FString> UAtecConnectLibrary::GetArrayFromString(FString raw,
  249. FString arrayName, FString objectName)
  250. {
  251. //ARRAY STRING: SERVERS=[SERVER={IP:0.0.0.0;PORT=7777;};SERVER={IP:0.0.0.0;PORT=7777;};];
  252.  
  253.  
  254. FString ArrayString = GetParameterFromString(raw, arrayName);
  255. //EXPECTED RETURNS; [SERVER={IP:0.0.0.0;PORT=7777;};SERVER={IP:0.0.0.0;PORT=7777;};];
  256.  
  257. //Trim String
  258. int32 ArrayDataStart = ArrayString.Find("[") + 1;
  259. int32 ArrayDataEnd = ArrayString.Find("]");
  260. FString ArrayData = ArrayString.Mid(ArrayDataStart, ArrayDataEnd - ArrayDataStart);
  261.  
  262. TArray<int32> ObjectIndexes;
  263. bool ObjectFinderCompleted = false;
  264. int32 LastIndex = 0;
  265.  
  266. TArray<FString> ArrayReturn;
  267. int32 LoopCount = 0;
  268.  
  269.  
  270. while (!ObjectFinderCompleted)
  271. {
  272. int32 CurrentIndex = ArrayData.Find(objectName, ESearchCase::CaseSensitive, ESearchDir::FromStart, LastIndex);
  273. LastIndex = CurrentIndex + objectName.Len();
  274.  
  275.  
  276. LoopCount++;
  277.  
  278. if (CurrentIndex == -1 || LoopCount == 5)
  279. {
  280. ObjectFinderCompleted = true;
  281. }
  282. else
  283. {
  284.  
  285. ObjectIndexes.Add(CurrentIndex);
  286. }
  287. }
  288.  
  289. for (int i = 0; i < ObjectIndexes.Num(); i++)
  290. {
  291. int32 ObjectLength = ArrayData.Find(TEXT(";"), ESearchCase::CaseSensitive,
  292. ESearchDir::FromEnd, ObjectIndexes[i] + objectName.Len()) - ObjectIndexes[i];
  293.  
  294. FString ObjectToParse = ArrayData.Mid(ObjectIndexes[i]);
  295.  
  296.  
  297. FString ObjectToAdd = GetObjectFromString(ObjectToParse, objectName);
  298. ArrayReturn.Add(ObjectToAdd);
  299. }
  300.  
  301. return ArrayReturn;
  302. }
  303.  
  304. FString UAtecConnectLibrary::GetObjectFromString(FString raw, FString objectName)
  305. {
  306.  
  307. //OBJECT STRING: SERVER={IP:0.0.0.0;PORT=7777;};
  308.  
  309. FString ObjectString = GetParameterFromString(raw, objectName);
  310. //EXPECTED RETURN: {IP:0.0.0.0;PORT=7777;};
  311.  
  312. //Trim String
  313. int32 ObjectDataStart = ObjectString.Find("{") + 1;
  314. int32 ObjectDataEnd = ObjectString.Find("}");
  315. FString ObjectData = ObjectString.Mid(ObjectDataStart, ObjectDataEnd - ObjectDataStart);
  316.  
  317. //RETURN: IP:0.0.0.0;PORT=7777;
  318. return ObjectData;
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement