From 151c4642770d6dcc74bac8eac5d52856355ebffc Mon Sep 17 00:00:00 2001 From: bobaoapae Date: Tue, 12 Nov 2024 00:10:13 -0300 Subject: [PATCH] update mac/ios project to the new logic of keep all relevant logic on csharp project. --- .../AneAwesomeUtils.xcodeproj/project.pbxproj | 1 - .../UserInterfaceState.xcuserstate | Bin 59096 -> 61179 bytes .../AneAwesomeUtils/AneAwesomeUtilsCsharp.h | 36 +-- .../AneAwesomeUtilsSupport.cpp | 237 ++++++------------ .../AneAwesomeUtils/DataArray.h | 14 ++ .../AneAwesomeUtils/WebSocketClient.cpp | 42 ---- .../AneAwesomeUtils/WebSocketClient.hpp | 37 --- 7 files changed, 108 insertions(+), 259 deletions(-) create mode 100644 AppleNative/AneAwesomeUtils/AneAwesomeUtils/DataArray.h delete mode 100644 AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.cpp delete mode 100644 AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.hpp diff --git a/AppleNative/AneAwesomeUtils/AneAwesomeUtils.xcodeproj/project.pbxproj b/AppleNative/AneAwesomeUtils/AneAwesomeUtils.xcodeproj/project.pbxproj index 3c41d51..a18a53e 100644 --- a/AppleNative/AneAwesomeUtils/AneAwesomeUtils.xcodeproj/project.pbxproj +++ b/AppleNative/AneAwesomeUtils/AneAwesomeUtils.xcodeproj/project.pbxproj @@ -59,7 +59,6 @@ AneAwesomeUtilsSupport.cpp, DeviceUtils.m, log.cpp, - WebSocketClient.cpp, ); target = 57B755732CD02AFF0000FE66 /* AneAwesomeUtils-IOS */; }; diff --git a/AppleNative/AneAwesomeUtils/AneAwesomeUtils.xcodeproj/project.xcworkspace/xcuserdata/joaovitorborges.xcuserdatad/UserInterfaceState.xcuserstate b/AppleNative/AneAwesomeUtils/AneAwesomeUtils.xcodeproj/project.xcworkspace/xcuserdata/joaovitorborges.xcuserdatad/UserInterfaceState.xcuserstate index f63755619aadfabdca8b0a8ce5a228b6c8c1d3c1..5add5243badf737efea2415295486bac12936d40 100644 GIT binary patch literal 61179 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 #include -#include -#include -#include -#include -#include typedef void* NSWindow; // don't need this.. #include // Adobe AIR runtime includes #include "log.hpp" @@ -16,69 +10,30 @@ typedef void* NSWindow; // don't need this.. #endif static bool alreadyInitialized = false; -static FRENamedFunction* exportedFunctions = new FRENamedFunction[11]; -static std::unordered_map wsClientMap; -static std::mutex wsClientMapMutex; -static std::unordered_map> loaderResultMap; -static std::mutex loaderResultMapMutex; +static FRENamedFunction *exportedFunctions = new FRENamedFunction[11]; static FREContext context; -// Helper function to safely retrieve WebSocketClient from the map -static WebSocketClient* getWebSocketClient(std::string guidString) { - std::lock_guard guard(wsClientMapMutex); - auto it = wsClientMap.find(guidString); - if (it != wsClientMap.end()) { - return it->second; - } - return nullptr; -} - -// Helper function to safely insert WebSocketClient into the map -static void setWebSocketClient(std::string guidString, WebSocketClient* wsClient) { - std::lock_guard guard(wsClientMapMutex); - wsClientMap[guidString] = wsClient; -} - -// Helper function to safely remove WebSocketClient from the map -static void removeWebSocketClient(std::string guidString) { - std::lock_guard guard(wsClientMapMutex); - wsClientMap.erase(guidString); -} - -static void dispatchWebSocketEvent(const char* guid, const char* code, const char* level) { +static void dispatchWebSocketEvent(const char *guid, const char *code, const char *level) { std::string fullCode = std::string("web-socket;") + code + std::string(";") + guid; FREDispatchStatusEventAsync(context, reinterpret_cast(fullCode.c_str()), reinterpret_cast(level)); } -static void dispatchUrlLoaderEvent(const char* guid, const char* code, const char* level) { +static void dispatchUrlLoaderEvent(const char *guid, const char *code, const char *level) { std::string fullCode = std::string("url-loader;") + code + std::string(";") + guid; FREDispatchStatusEventAsync(context, reinterpret_cast(fullCode.c_str()), reinterpret_cast(level)); } -__cdecl static void webSocketConnectCallBack(char* guid) { +static void __cdecl webSocketConnectCallBack(char *guid) { writeLog("connectCallback called"); dispatchWebSocketEvent(guid, "connected", ""); } -__cdecl static void webSocketDataCallBack(char* guid, const uint8_t *data, int length) { +static void __cdecl webSocketDataCallBack(char *guid) { writeLog("dataCallback called"); - - WebSocketClient* wsClient = getWebSocketClient(guid); - - if(wsClient == nullptr){ - writeLog("wsClient not found"); - return; - } - - auto dataCopyVector = std::vector(); - dataCopyVector.resize(length); - std::copy_n(data, length, dataCopyVector.begin()); - wsClient->enqueueMessage(dataCopyVector); - dispatchWebSocketEvent(guid, "nextMessage", ""); } -__cdecl static void webSocketErrorCallBack(char* guid, int closeCode, const char *reason) { +static void __cdecl webSocketErrorCallBack(char *guid, int closeCode, const char *reason) { writeLog("disconnectCallback called"); auto closeCodeReason = std::to_string(closeCode) + ";" + std::string(reason); @@ -86,29 +41,28 @@ __cdecl static void webSocketErrorCallBack(char* guid, int closeCode, const char writeLog(closeCodeReason.c_str()); dispatchWebSocketEvent(guid, "disconnected", closeCodeReason.c_str()); - removeWebSocketClient(guid); } -__cdecl void urlLoaderSuccessCallBack(const char *id, uint8_t *result, int32_t length) { +static void __cdecl urlLoaderSuccessCallBack(const char *id) { writeLog("Calling SuccessCallback"); + // Prepare data outside the lock to minimize locked duration std::string id_str(id); + writeLog(("ID: " + id_str).c_str()); - writeLog(("Result Length: " + std::to_string(length)).c_str()); - std::lock_guard lock(loaderResultMapMutex); - loaderResultMap.insert({id_str, std::vector(result, result + length)}); + dispatchUrlLoaderEvent(id_str.c_str(), "success", ""); - dispatchUrlLoaderEvent(id, "success", ""); + // Notify and log the success event outside the lock writeLog("Dispatched success event"); } -__cdecl void urlLoaderProgressCallBack(const char *id, const char *message) { - dispatchUrlLoaderEvent(id, "progress", message); +static void __cdecl urlLoaderProgressCallBack(const char *id, const char *message) { + dispatchUrlLoaderEvent(std::string(id).c_str(), "progress", message); } -__cdecl void urlLoaderErrorCallBack(const char *id, const char *message) { - dispatchUrlLoaderEvent(id, "error", message); +static void __cdecl urlLoaderErrorCallBack(const char *id, const char *message) { + dispatchUrlLoaderEvent(std::string(id).c_str(), "error", message); } static void writeLogCallback(const char *message) { @@ -119,15 +73,15 @@ static void writeLogCallback(const char *message) { static FREObject awesomeUtils_initialize(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { writeLog("initialize called"); auto initResult = csharpLibrary_awesomeUtils_initialize( - (void*)&urlLoaderSuccessCallBack, - (void*)&urlLoaderProgressCallBack, - (void*)&urlLoaderErrorCallBack, - (void*)&webSocketConnectCallBack, - (void*)&webSocketErrorCallBack, - (void*)&webSocketDataCallBack, - (void*)&writeLogCallback - ); - + (void *) &urlLoaderSuccessCallBack, + (void *) &urlLoaderProgressCallBack, + (void *) &urlLoaderErrorCallBack, + (void *) &webSocketConnectCallBack, + (void *) &webSocketErrorCallBack, + (void *) &webSocketDataCallBack, + (void *) &writeLogCallback + ); + FREObject resultBool; FRENewObjectFromBool(initResult == 1, &resultBool); return resultBool; @@ -135,12 +89,12 @@ static FREObject awesomeUtils_initialize(FREContext ctx, void *funcData, uint32_ static FREObject awesomeUtils_createWebSocket(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { writeLog("createWebSocket called"); - auto idWebSocket = csharpLibrary_awesomeUtils_createWebSocket(); - auto wsClient = new WebSocketClient(idWebSocket); - setWebSocketClient(std::string(idWebSocket), wsClient); - + + // Capture idWebSocket immediately as a string + const char *idWebSocketPtr = csharpLibrary_awesomeUtils_createWebSocket(); + FREObject resultStr; - FRENewObjectFromUTF8((uint32_t)strlen(idWebSocket), (const uint8_t *)idWebSocket, &resultStr); + FRENewObjectFromUTF8(strlen(idWebSocketPtr), reinterpret_cast(idWebSocketPtr), &resultStr); return resultStr; } @@ -162,16 +116,7 @@ static FREObject awesomeUtils_connectWebSocket(FREContext ctx, void *funcData, u writeLog("Calling connect to uri: "); writeLog(uriChar); - WebSocketClient* wsClient = getWebSocketClient(idChar); - - if(wsClient == nullptr){ - writeLog("wsClient not found"); - return nullptr; - } - - if (wsClient != nullptr) { - wsClient->connect(reinterpret_cast(uri)); - } + csharpLibrary_awesomeUtils_connectWebSocket(idChar, uriChar); return nullptr; } @@ -185,19 +130,10 @@ static FREObject awesomeUtils_closeWebSocket(FREContext ctx, void *funcData, uin FREGetObjectAsUTF8(argv[0], &idLength, &id); auto idChar = reinterpret_cast(id); - WebSocketClient* wsClient = getWebSocketClient(idChar); - - if(wsClient == nullptr){ - writeLog("wsClient not found"); - return nullptr; - } - uint32_t closeCode = 1000; // Default close code - if (argc > 0) { - FREGetObjectAsUint32(argv[0], &closeCode); - } + FREGetObjectAsUint32(argv[0], &closeCode); - wsClient->close(closeCode); + csharpLibrary_awesomeUtils_closeWebSocket(idChar, static_cast(closeCode)); return nullptr; } @@ -210,8 +146,6 @@ static FREObject awesomeUtils_sendWebSocketMessage(FREContext ctx, void *funcDat FREGetObjectAsUTF8(argv[0], &idLength, &id); auto idChar = reinterpret_cast(id); - WebSocketClient* wsClient = getWebSocketClient(idChar); - uint32_t messageType; FREGetObjectAsUint32(argv[1], &messageType); @@ -224,7 +158,7 @@ static FREObject awesomeUtils_sendWebSocketMessage(FREContext ctx, void *funcDat FREByteArray byteArray; FREAcquireByteArray(argv[2], &byteArray); - wsClient->sendMessage(byteArray.bytes, static_cast(byteArray.length)); + csharpLibrary_awesomeUtils_sendWebSocketMessage(idChar, byteArray.bytes, static_cast(byteArray.length)); FREReleaseByteArray(argv[2]); } @@ -235,7 +169,7 @@ static FREObject awesomeUtils_sendWebSocketMessage(FREContext ctx, void *funcDat static FREObject awesomeUtils_getWebSocketByteArrayMessage(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { writeLog("getByteArrayMessage called"); - + if (argc < 1) return nullptr; uint32_t idLength; @@ -243,29 +177,22 @@ static FREObject awesomeUtils_getWebSocketByteArrayMessage(FREContext ctx, void FREGetObjectAsUTF8(argv[0], &idLength, &id); auto idChar = reinterpret_cast(id); - WebSocketClient* wsClient = getWebSocketClient(idChar); - - auto nextMessageResult = wsClient->getNextMessage(); + auto nextMessageResult = csharpLibrary_awesomeUtils_getWebSocketMessage(idChar); - if (!nextMessageResult.has_value()) { + if (nextMessageResult.Size == 0) { writeLog("no messages found"); return nullptr; } - auto vectorData = nextMessageResult.value(); - - if (vectorData.empty()) { - writeLog("message it's empty"); - return nullptr; - } - FREObject byteArrayObject = nullptr; FREByteArray byteArray; - byteArray.length = (uint32_t)vectorData.size(); - byteArray.bytes = vectorData.data(); + byteArray.length = nextMessageResult.Size; + byteArray.bytes = nextMessageResult.DataPointer; FRENewByteArray(&byteArray, &byteArrayObject); + free(nextMessageResult.DataPointer); + return byteArrayObject; } @@ -275,74 +202,64 @@ static FREObject awesomeUtils_loadUrl(FREContext ctx, void *funcData, uint32_t a uint32_t stringLength; const uint8_t *url; FREGetObjectAsUTF8(argv[0], &stringLength, &url); - writeLog(("URL: " + std::string((const char *)url)).c_str()); + writeLog(("URL: " + std::string(reinterpret_cast(url))).c_str()); uint32_t methodLength; const uint8_t *method; FREGetObjectAsUTF8(argv[1], &methodLength, &method); - writeLog(("Method: " + std::string((const char *)method)).c_str()); + writeLog(("Method: " + std::string(reinterpret_cast(method))).c_str()); uint32_t variableLength; const uint8_t *variable; FREGetObjectAsUTF8(argv[2], &variableLength, &variable); - writeLog(("Variable: " + std::string((const char *)variable)).c_str()); + writeLog(("Variable: " + std::string(reinterpret_cast(variable))).c_str()); uint32_t headersLength; const uint8_t *headers; FREGetObjectAsUTF8(argv[3], &headersLength, &headers); - writeLog(("Headers: " + std::string((const char *)headers)).c_str()); + writeLog(("Headers: " + std::string(reinterpret_cast(headers))).c_str()); - char *result = csharpLibrary_awesomeUtils_loadUrl((const char *)url, (const char *)method, (const char *)variable, (const char *)headers); + char *result = csharpLibrary_awesomeUtils_loadUrl(reinterpret_cast(url), reinterpret_cast(method), reinterpret_cast(variable), reinterpret_cast(headers)); if (!result) { writeLog("startLoader returned null"); return nullptr; } - writeLog(("Result: " + std::string(result)).c_str()); + auto resultString = std::string(result); + + writeLog(("Result: " + resultString).c_str()); FREObject resultStr; - FRENewObjectFromUTF8((uint32_t)strlen(result), (const uint8_t *)result, &resultStr); + FRENewObjectFromUTF8(resultString.length(), reinterpret_cast(resultString.c_str()), &resultStr); free(result); return resultStr; } - static FREObject awesomeUtils_getLoaderResult(FREContext ctx, void *functionData, uint32_t argc, FREObject argv[]) { writeLog("Calling getResult"); + // Extract UUID from arguments uint32_t uuidLength; const uint8_t *uuid; FREGetObjectAsUTF8(argv[0], &uuidLength, &uuid); - std::string uuidStr(reinterpret_cast(uuid), uuidLength); - writeLog(("GetResult ID: " + uuidStr).c_str()); - - std::vector result; - std::lock_guard lock(loaderResultMapMutex); - auto it = loaderResultMap.find(uuidStr); - if (it != loaderResultMap.end()) { - result = it->second; - loaderResultMap.erase(it); - writeLog("Result found"); - } + auto uuidChar = reinterpret_cast(uuid); + auto result = csharpLibrary_awesomeUtils_getLoaderResult(uuidChar); + + // Handle the result outside the lock FREObject byteArrayObject = nullptr; - if (!result.empty()) { - writeLog("Creating AS3 ByteArray"); + if (result.Size > 0) { FREByteArray byteArray; - byteArray.length = (uint32_t)result.size(); - byteArray.bytes = result.data(); - + byteArray.length = result.Size; + byteArray.bytes = result.DataPointer; FRENewByteArray(&byteArray, &byteArrayObject); - writeLog("AS3 ByteArray created"); - } else { - writeLog("Result is empty"); + free(result.DataPointer); } - - result.clear(); return byteArrayObject; } + static FREObject awesomeUtils_addStaticHost(FREContext ctx, void *funcData, uint32_t argc, FREObject argv[]) { writeLog("addStaticHost called"); if (argc < 2) return nullptr; @@ -402,35 +319,35 @@ static FREObject awesomeUtils_getDeviceUniqueId(FREContext ctx, void *funcData, } static void AneAwesomeUtilsSupportInitializer( - void* extData, - const uint8_t* ctxType, - FREContext ctx, - uint32_t* numFunctionsToSet, - const FRENamedFunction** functionsToSet + void *extData, + const uint8_t *ctxType, + FREContext ctx, + uint32_t *numFunctionsToSet, + const FRENamedFunction **functionsToSet ) { - if(!alreadyInitialized){ + if (!alreadyInitialized) { alreadyInitialized = true; - exportedFunctions[0].name = (const uint8_t*)"awesomeUtils_initialize"; + exportedFunctions[0].name = reinterpret_cast("awesomeUtils_initialize"); exportedFunctions[0].function = awesomeUtils_initialize; - exportedFunctions[1].name = (const uint8_t*)"awesomeUtils_createWebSocket"; + exportedFunctions[1].name = reinterpret_cast("awesomeUtils_createWebSocket"); exportedFunctions[1].function = awesomeUtils_createWebSocket; - exportedFunctions[2].name = (const uint8_t*)"awesomeUtils_sendWebSocketMessage"; + exportedFunctions[2].name = reinterpret_cast("awesomeUtils_sendWebSocketMessage"); exportedFunctions[2].function = awesomeUtils_sendWebSocketMessage; - exportedFunctions[3].name = (const uint8_t*)"awesomeUtils_closeWebSocket"; + exportedFunctions[3].name = reinterpret_cast("awesomeUtils_closeWebSocket"); exportedFunctions[3].function = awesomeUtils_closeWebSocket; - exportedFunctions[4].name = (const uint8_t*)"awesomeUtils_connectWebSocket"; + exportedFunctions[4].name = (const uint8_t *) "awesomeUtils_connectWebSocket"; exportedFunctions[4].function = awesomeUtils_connectWebSocket; - exportedFunctions[5].name = (const uint8_t*)"awesomeUtils_addStaticHost"; + exportedFunctions[5].name = (const uint8_t *) "awesomeUtils_addStaticHost"; exportedFunctions[5].function = awesomeUtils_addStaticHost; - exportedFunctions[6].name = (const uint8_t*)"awesomeUtils_removeStaticHost"; + exportedFunctions[6].name = (const uint8_t *) "awesomeUtils_removeStaticHost"; exportedFunctions[6].function = awesomeUtils_removeStaticHost; - exportedFunctions[7].name = (const uint8_t*)"awesomeUtils_loadUrl"; + exportedFunctions[7].name = (const uint8_t *) "awesomeUtils_loadUrl"; exportedFunctions[7].function = awesomeUtils_loadUrl; - exportedFunctions[8].name = (const uint8_t*)"awesomeUtils_getLoaderResult"; + exportedFunctions[8].name = (const uint8_t *) "awesomeUtils_getLoaderResult"; exportedFunctions[8].function = awesomeUtils_getLoaderResult; - exportedFunctions[9].name = (const uint8_t*)"awesomeUtils_getWebSocketByteArrayMessage"; + exportedFunctions[9].name = (const uint8_t *) "awesomeUtils_getWebSocketByteArrayMessage"; exportedFunctions[9].function = awesomeUtils_getWebSocketByteArrayMessage; - exportedFunctions[10].name = (const uint8_t*)"awesomeUtils_getDeviceUniqueId"; + exportedFunctions[10].name = (const uint8_t *) "awesomeUtils_getDeviceUniqueId"; exportedFunctions[10].function = awesomeUtils_getDeviceUniqueId; context = ctx; } @@ -439,11 +356,9 @@ static void AneAwesomeUtilsSupportInitializer( } static void AneAwesomeUtilsSupportFinalizer(FREContext ctx) { - } extern "C" { - __attribute__ ((visibility ("default"))) void InitExtension(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet) { writeLog("InitExtension called"); diff --git a/AppleNative/AneAwesomeUtils/AneAwesomeUtils/DataArray.h b/AppleNative/AneAwesomeUtils/AneAwesomeUtils/DataArray.h new file mode 100644 index 0000000..adc3f24 --- /dev/null +++ b/AppleNative/AneAwesomeUtils/AneAwesomeUtils/DataArray.h @@ -0,0 +1,14 @@ +// +// Created by User on 11/11/2024. +// + +#ifndef DATAARRAY_H +#define DATAARRAY_H +#include + +struct DataArray +{ + uint8_t* DataPointer; + int Size; +}; +#endif //DATAARRAY_H diff --git a/AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.cpp b/AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.cpp deleted file mode 100644 index aaba20e..0000000 --- a/AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "AneAwesomeUtilsCsharp.h" -#include "WebSocketClient.hpp" -#include "log.hpp" - -WebSocketClient::WebSocketClient(char* guid) { - writeLog("WebSocketClient created"); - m_guidPointer = guid; - writeLog(m_guidPointer); -} - -WebSocketClient::~WebSocketClient() { -} - -void WebSocketClient::connect(const char* uri) { - csharpLibrary_awesomeUtils_connectWebSocket(m_guidPointer, uri); -} - -void WebSocketClient::close(uint32_t closeCode) { - csharpLibrary_awesomeUtils_closeWebSocket(m_guidPointer, static_cast(closeCode)); -} - -void WebSocketClient::sendMessage(uint8_t* bytes, int lenght) { - csharpLibrary_awesomeUtils_sendWebSocketMessage(m_guidPointer, bytes, lenght); -} - -std::optional > WebSocketClient::getNextMessage() { - std::lock_guard guard(m_lock_receive_queue); - if (m_received_message_queue.empty()) { - return std::nullopt; - } - - // Pega a próxima mensagem da fila - std::vector message = std::move(m_received_message_queue.front()); - m_received_message_queue.pop(); - - return message; -} - -void WebSocketClient::enqueueMessage(const std::vector &message) { - std::lock_guard guard(m_lock_receive_queue); - m_received_message_queue.push(message); -} diff --git a/AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.hpp b/AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.hpp deleted file mode 100644 index 839f395..0000000 --- a/AppleNative/AneAwesomeUtils/AneAwesomeUtils/WebSocketClient.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// -// WebSocketClient.hpp -// WebSocketANE -// -// Created by João Vitor Borges on 23/08/24. -// - -#ifndef WebSocketClient_hpp -#define WebSocketClient_hpp - -#include -#include -#include -#include -#include -#include -#include - -class WebSocketClient { -public: - WebSocketClient(char* guid); - - ~WebSocketClient(); - - void connect(const char* uri); - void close(uint32_t closeCode); - void sendMessage(uint8_t* bytes, int lenght); - std::optional> getNextMessage(); - void enqueueMessage(const std::vector& message); - -private: - std::mutex m_lock_receive_queue; - std::queue> m_received_message_queue; - char* m_guidPointer; -}; - -#endif /* WebSocketClient_hpp */