aboutsummaryrefslogtreecommitdiff
path: root/extension/opensslthread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'extension/opensslthread.cpp')
-rw-r--r--extension/opensslthread.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/extension/opensslthread.cpp b/extension/opensslthread.cpp
new file mode 100644
index 0000000..84e2286
--- /dev/null
+++ b/extension/opensslthread.cpp
@@ -0,0 +1,100 @@
+#include "opensslthread.h"
+
+
+OpensslThread::OpensslThread(void *_data, OpensslThread_Type _type):
+type(_type),data(_data)
+{
+ assert((type > OpensslThread_Type_NOTHING && type < OpensslThread_Type_LAST));
+ assert((data != NULL));
+}
+
+
+OpensslThread::~OpensslThread()
+{
+
+}
+
+static void openssl_hash_FramAction(void *data)
+{
+ if(data == NULL)
+ return;
+
+ Openssl_Hash_pack *handle = (Openssl_Hash_pack *)data;
+
+ IPluginFunction *pFunc = handle->hash_callback;
+ assert((pFunc != NULL));
+ if(pFunc != NULL)
+ {
+ pFunc->PushCell(handle->success);
+ if(handle->output == NULL)
+ pFunc->PushString("");
+ else
+ pFunc->PushString(handle->output);
+ pFunc->PushCell(handle->UserData);
+ pFunc->Execute(NULL);
+ }
+
+ if(handle->output != NULL)
+ delete handle->output;
+ if(handle->path != NULL)
+ delete handle->path;
+ delete handle;
+}
+
+void OpensslThread::RunFileHash()
+{
+ Openssl_Hash_pack *handle = (Openssl_Hash_pack *)data;
+ handle->success = false;
+
+ assert((handle->path != NULL));
+
+ char realpath[PLATFORM_MAX_PATH];
+ g_pSM->BuildPath(Path_Game, realpath, sizeof(realpath), "%s", handle->path);
+ FILE *pFile = fopen(realpath, "rb");
+ if(!pFile)
+ return;
+
+ unsigned char *output = NULL;
+ int outlength;
+
+ if(!g_OpensslManager.HashFile(handle->algorithm, pFile, &output, &outlength))
+ goto clean;
+
+ assert((output != NULL));
+ if(output != NULL)
+ {
+ handle->output = new char[outlength*2+1];
+ int pos = 0;
+ for(int i=0; i<outlength; i++)
+ {
+ sprintf(&handle->output[pos],"%02x",(unsigned char)output[i]);
+ pos+=2;
+ }
+ handle->success = true;
+ }
+
+clean:
+ if(output != NULL)
+ delete output;
+
+ fclose(pFile);
+}
+
+void OpensslThread::RunThread(IThreadHandle *pHandle)
+{
+ if(type == OpensslThread_Type_HASH_FILE)
+ {
+ RunFileHash();
+ }
+}
+
+void OpensslThread::OnTerminate(IThreadHandle *pHandle, bool cancel)
+{
+ if(type == OpensslThread_Type_HASH_FILE)
+ {
+ smutils->AddFrameAction(openssl_hash_FramAction, data);
+ }
+
+ delete this;
+}
+