diff options
Diffstat (limited to 'plugins/MirLua')
-rw-r--r-- | plugins/MirLua/src/m_core.cpp | 2 | ||||
-rw-r--r-- | plugins/MirLua/src/m_database.cpp | 167 | ||||
-rw-r--r-- | plugins/MirLua/src/mlua_utils.cpp | 20 |
3 files changed, 124 insertions, 65 deletions
diff --git a/plugins/MirLua/src/m_core.cpp b/plugins/MirLua/src/m_core.cpp index 1ce4c6fcdb..2a5564a07b 100644 --- a/plugins/MirLua/src/m_core.cpp +++ b/plugins/MirLua/src/m_core.cpp @@ -165,7 +165,7 @@ static int lua_Utf8DecodeA(lua_State *L) const char *string = luaL_checkstring(L, 1);
char *res = mir_utf8decodeA(string);
- lua_pushstring(L, res);
+ lua_pushlightuserdata(L, res);
return 1;
}
diff --git a/plugins/MirLua/src/m_database.cpp b/plugins/MirLua/src/m_database.cpp index 2410dec01f..3f553c983f 100644 --- a/plugins/MirLua/src/m_database.cpp +++ b/plugins/MirLua/src/m_database.cpp @@ -198,6 +198,66 @@ static int lua_GetContactSetting(lua_State *L) return 1;
}
+typedef struct
+{
+ int arrlen;
+ char **pszSettingName;
+}
+enumDBSettingsParam;
+
+static int SettingsEnumProc(const char* szSetting, LPARAM lParam)
+{
+ if (szSetting)
+ {
+ enumDBSettingsParam* p = (enumDBSettingsParam*)lParam;
+
+ p->arrlen++;
+ p->pszSettingName = (char**)mir_realloc(p->pszSettingName, p->arrlen * sizeof(char*));
+ p->pszSettingName[p->arrlen - 1] = mir_strdup(szSetting);
+ }
+ return 0;
+}
+
+static int lua_EnumSettings(lua_State *L)
+{
+ MCONTACT hContact = lua_tointeger(L, 1);
+ LPCSTR szModule = luaL_checkstring(L, 2);
+
+ if (!lua_isfunction(L, 3))
+ {
+ lua_pushlightuserdata(L, NULL);
+ return 1;
+ }
+
+ lua_pushvalue(L, 3);
+ int ref = luaL_ref(L, LUA_REGISTRYINDEX);
+
+ enumDBSettingsParam param = { 0, NULL };
+
+ DBCONTACTENUMSETTINGS dbces = { 0 };
+ dbces.pfnEnumProc = SettingsEnumProc;
+ dbces.szModule = szModule;
+ dbces.ofsSettings = 0;
+ dbces.lParam = (LPARAM)¶m;
+ INT_PTR res = ::CallService(MS_DB_CONTACT_ENUMSETTINGS, hContact, (LPARAM)&dbces);
+
+ for (int i = 0; i < param.arrlen; i++)
+ {
+ lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
+ lua_pushstring(L, mir_utf8encode(param.pszSettingName[i]));
+ if (lua_pcall(L, 1, 0, 0))
+ CallService(MS_NETLIB_LOG, (WPARAM)hNetlib, (LPARAM)lua_tostring(L, -1));
+
+ mir_free(param.pszSettingName[i]);
+ }
+ mir_free(param.pszSettingName);
+
+ luaL_unref(L, LUA_REGISTRYINDEX, ref);
+ lua_pushinteger(L, res);
+
+ return 1;
+}
+
static int lua_DeleteContactSetting(lua_State *L)
{
MCONTACT hContact = lua_tointeger(L, 1);
@@ -221,6 +281,46 @@ static int lua_DeleteModule(lua_State *L) return 1;
}
+static int SettingsChangedHookEventObjParam(void *obj, WPARAM wParam, LPARAM lParam, LPARAM param)
+{
+ lua_State *L = (lua_State*)obj;
+
+ int ref = param;
+ lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
+
+ lua_pushnumber(L, wParam);
+
+ DBCONTACTWRITESETTING *dbcws = (DBCONTACTWRITESETTING*)lParam;
+
+
+ if (lua_pcall(L, 2, 1, 0))
+ printf("%s\n", lua_tostring(L, -1));
+
+ int res = (int)lua_tointeger(L, 1);
+
+ return res;
+}
+
+static int lua_OnContactSettingChanged(lua_State *L)
+{
+ if (!lua_isfunction(L, 1))
+ {
+ lua_pushlightuserdata(L, NULL);
+ return 1;
+ }
+
+ lua_pushvalue(L, 1);
+ int ref = luaL_ref(L, LUA_REGISTRYINDEX);
+
+ HANDLE res = ::HookEventObjParam(ME_DB_CONTACT_SETTINGCHANGED, SettingsChangedHookEventObjParam, L, ref);
+ lua_pushlightuserdata(L, res);
+
+ CMLua::Hooks.insert(res);
+ CMLua::HookRefs.insert(new HandleRefParam(L, res, ref));
+
+ return 1;
+}
+
static int lua_DecodeDBCONTACTWRITESETTING(lua_State *L)
{
DBCONTACTWRITESETTING *pDBCWS = (DBCONTACTWRITESETTING*)lua_tointeger(L, 1);
@@ -262,66 +362,6 @@ static int lua_DecodeDBCONTACTWRITESETTING(lua_State *L) return 1;
}
-typedef struct
-{
- int arrlen;
- char **pszSettingName;
-}
-enumDBSettingsParam;
-
-static int SettingsEnumProc(const char* szSetting, LPARAM lParam)
-{
- if (szSetting)
- {
- enumDBSettingsParam* p = (enumDBSettingsParam*)lParam;
-
- p->arrlen++;
- p->pszSettingName = (char**)mir_realloc(p->pszSettingName, p->arrlen * sizeof(char*));
- p->pszSettingName[p->arrlen - 1] = mir_strdup(szSetting);
- }
- return 0;
-}
-
-static int lua_EnumSettings(lua_State *L)
-{
- MCONTACT hContact = lua_tointeger(L, 1);
- LPCSTR szModule = luaL_checkstring(L, 2);
-
- if (!lua_isfunction(L, 3))
- {
- lua_pushlightuserdata(L, NULL);
- return 1;
- }
-
- lua_pushvalue(L, 3);
- int ref = luaL_ref(L, LUA_REGISTRYINDEX);
-
- enumDBSettingsParam param = { 0, NULL };
-
- DBCONTACTENUMSETTINGS dbces = { 0 };
- dbces.pfnEnumProc = SettingsEnumProc;
- dbces.szModule = szModule;
- dbces.ofsSettings = 0;
- dbces.lParam = (LPARAM)¶m;
- INT_PTR res = ::CallService(MS_DB_CONTACT_ENUMSETTINGS, hContact, (LPARAM)&dbces);
-
- for (int i = 0; i < param.arrlen; i++)
- {
- lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
- lua_pushstring(L, mir_utf8encode(param.pszSettingName[i]));
- if (lua_pcall(L, 1, 0, 0))
- CallService(MS_NETLIB_LOG, (WPARAM)hNetlib, (LPARAM)lua_tostring(L, -1));
-
- mir_free(param.pszSettingName[i]);
- }
- mir_free(param.pszSettingName);
-
- luaL_unref(L, LUA_REGISTRYINDEX, ref);
- lua_pushinteger(L, res);
-
- return 1;
-}
-
static luaL_Reg databaseApi[] =
{
{ "FindFirstContact", lua_FindFirstContact },
@@ -337,13 +377,14 @@ static luaL_Reg databaseApi[] = { "GetEvent", lua_GetEvent },
{ "WriteContactSetting", lua_WriteContactSetting },
+
{ "GetContactSetting", lua_GetContactSetting },
- { "DeleteContactSetting", lua_DeleteContactSetting },
+ { "EnumSettings", lua_EnumSettings },
+ { "DeleteContactSetting", lua_DeleteContactSetting },
{ "DeleteModule", lua_DeleteModule },
- { "EnumSettings", lua_EnumSettings },
-
+ { "OnContactSettingChanged", lua_OnContactSettingChanged },
{ "DecodeDBCONTACTWRITESETTING", lua_DecodeDBCONTACTWRITESETTING },
{ NULL, NULL }
diff --git a/plugins/MirLua/src/mlua_utils.cpp b/plugins/MirLua/src/mlua_utils.cpp index 3a58867171..7fa59212c5 100644 --- a/plugins/MirLua/src/mlua_utils.cpp +++ b/plugins/MirLua/src/mlua_utils.cpp @@ -5,7 +5,25 @@ int luaM_print(lua_State *L) CMStringA data;
int nargs = lua_gettop(L);
for (int i = 1; i <= nargs; ++i)
- data.AppendFormat("%s ", lua_tostring(L, i));
+ {
+ switch (lua_type(L, i))
+ {
+ case LUA_TNIL:
+ data.AppendFormat("%s ", "nil");
+ break;
+ case LUA_TBOOLEAN:
+ case LUA_TNUMBER:
+ case LUA_TSTRING:
+ data.AppendFormat("%s ", lua_tostring(L, i));
+ break;
+ case LUA_TTABLE:
+ data.AppendFormat("%s ", "table");
+ break;
+ default:
+ data.AppendFormat("0x%p ", lua_topointer(L, i));
+ break;
+ }
+ }
data.Delete(data.GetLength() - 3, 3);
CallService(MS_NETLIB_LOG, (WPARAM)hNetlib, (LPARAM)data.GetBuffer());
|