diff options
-rw-r--r-- | plugins/MirLua/docs/examples/database.lua | 29 | ||||
-rw-r--r-- | plugins/MirLua/src/m_database.cpp | 201 | ||||
-rw-r--r-- | plugins/MirLua/src/m_protocols.cpp | 66 | ||||
-rw-r--r-- | plugins/MirLua/src/mlua_script_loader.cpp | 2 | ||||
-rw-r--r-- | plugins/MirLua/src/mlua_script_loader.h | 4 | ||||
-rw-r--r-- | plugins/MirLua/src/version.h | 2 |
6 files changed, 272 insertions, 32 deletions
diff --git a/plugins/MirLua/docs/examples/database.lua b/plugins/MirLua/docs/examples/database.lua index 93c17cb818..033293e5c7 100644 --- a/plugins/MirLua/docs/examples/database.lua +++ b/plugins/MirLua/docs/examples/database.lua @@ -1,23 +1,44 @@ --- include m_database module local db = require('m_database') +--- Iterate all contact stored in db +-- @param protoName The name of protocol account or nothing +for hContact in db.AllContacts() do + --print(hContact) +end + +local hContact = 15 + +--- Iterate all contact events stored in db +-- param hContact The handle of contact +for hEvent in db.AllEvents(hContact) do + --print(hEvent) +end + +--- Iterate all setting names stored in db +-- param module The name of module +-- param hContact The handle of contact or nothing +for setting in db.AllSettings('CList') do + --print(setting) +end + --- Save value to database -- @param hContact The handle of contact (can be NULL) -- @param module The name of section -- @param setting The name of setting -- @return value The value -db.WriteContactSetting(nil, 'MirLua', 'testNum', -2342) +db.WriteSetting(nil, 'MirLua', 'testNum', -2342) --- Return value from database -- @param hContact The handle of contact (can be NULL) -- @param module The name of section -- @param setting The name of setting -- @param default The value which will be returned if setting doesn't not exists -local bValue = db.GetContactSetting(nil, 'MirLua', 'testByte'); +local bValue = db.GetSetting(nil, 'MirLua', 'testByte'); -- print string value if bool value is true if bValue then - local sValue = db.GetContactSetting(nil, 'MirLua', 'testString', 'Hello!') + local sValue = db.GetSetting(nil, 'MirLua', 'testString', 'Hello!') print(sValue) end @@ -25,4 +46,4 @@ if bValue then -- @param hContact The handle of contact (can be NULL) -- @param module The name of section -- @param setting The name of setting -db.DeleteContactSetting(nil, 'MirLua', 'testNum'); +db.DeleteSetting(nil, 'MirLua', 'testNum'); diff --git a/plugins/MirLua/src/m_database.cpp b/plugins/MirLua/src/m_database.cpp index a1cf6f1dc6..537322d5f4 100644 --- a/plugins/MirLua/src/m_database.cpp +++ b/plugins/MirLua/src/m_database.cpp @@ -12,7 +12,7 @@ static int lua_FindFirstContact(lua_State *L) static int lua_FindNextContact(lua_State *L)
{
- MCONTACT hContact = lua_tointeger(L, 1);
+ MCONTACT hContact = luaL_checkinteger(L, 1);
const char *szProto = lua_tostring(L, 2);
MCONTACT res = db_find_next(hContact, szProto);
@@ -21,9 +21,43 @@ static int lua_FindNextContact(lua_State *L) return 1;
}
+static int lua_ContactIterator(lua_State *L)
+{
+ MCONTACT hContact = lua_tointeger(L, lua_upvalueindex(1));
+ const char *szProto = lua_tostring(L, lua_upvalueindex(2));
+
+ hContact = hContact == NULL
+ ? db_find_first(szProto)
+ : db_find_next(hContact);
+
+ if (hContact)
+ {
+ lua_pushinteger(L, hContact);
+ lua_pushvalue(L, -1);
+ lua_replace(L, lua_upvalueindex(1));
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+static int lua_AllContacts(lua_State *L)
+{
+ const char *szProto = lua_tostring(L, 1);
+
+ lua_pushinteger(L, NULL);
+ lua_pushstring(L, szProto);
+ lua_pushcclosure(L, lua_ContactIterator, 2);
+
+ return 1;
+}
+
+/***********************************************/
+
static int lua_GetEventCount(lua_State *L)
{
- MCONTACT hContact = lua_tointeger(L, 1);
+ MCONTACT hContact = luaL_checkinteger(L, 1);
int res = ::db_event_count(hContact);
lua_pushinteger(L, res);
@@ -33,7 +67,7 @@ static int lua_GetEventCount(lua_State *L) static int lua_GetFirstEvent(lua_State *L)
{
- MCONTACT hContact = lua_tointeger(L, 1);
+ MCONTACT hContact = luaL_checkinteger(L, 1);
MEVENT res = ::db_event_first(hContact);
lua_pushinteger(L, res);
@@ -43,8 +77,8 @@ static int lua_GetFirstEvent(lua_State *L) static int lua_GetPrevEvent(lua_State *L)
{
- MCONTACT hContact = lua_tointeger(L, 1);
- MEVENT hEvent = lua_tointeger(L, 2);
+ MCONTACT hContact = luaL_checkinteger(L, 1);
+ MEVENT hEvent = luaL_checkinteger(L, 2);
MEVENT res = ::db_event_prev(hContact, hEvent);
lua_pushinteger(L, res);
@@ -54,8 +88,8 @@ static int lua_GetPrevEvent(lua_State *L) static int lua_GetNextEvent(lua_State *L)
{
- MCONTACT hContact = lua_tointeger(L, 1);
- MEVENT hEvent = lua_tointeger(L, 2);
+ MCONTACT hContact = luaL_checkinteger(L, 1);
+ MEVENT hEvent = luaL_checkinteger(L, 2);
MEVENT res = ::db_event_next(hContact, hEvent);
lua_pushinteger(L, res);
@@ -65,7 +99,7 @@ static int lua_GetNextEvent(lua_State *L) static int lua_GetLastEvent(lua_State *L)
{
- MCONTACT hContact = lua_tointeger(L, 1);
+ MCONTACT hContact = luaL_checkinteger(L, 1);
MEVENT res = ::db_event_last(hContact);
lua_pushinteger(L, res);
@@ -75,7 +109,7 @@ static int lua_GetLastEvent(lua_State *L) static int lua_GetEvent(lua_State *L)
{
- MEVENT hEvent = lua_tointeger(L, 1);
+ MEVENT hEvent = luaL_checkinteger(L, 1);
DBEVENTINFO dbei = { sizeof(DBEVENTINFO) };
dbei.cbBlob = db_event_getBlobSize(hEvent);
@@ -119,7 +153,73 @@ static int lua_GetEvent(lua_State *L) return 1;
}
-static int lua_WriteContactSetting(lua_State *L)
+static int lua_EventIterator(lua_State *L)
+{
+ MCONTACT hContact = luaL_checkinteger(L, lua_upvalueindex(1));
+ MEVENT hEvent = luaL_checkinteger(L, lua_upvalueindex(2));
+
+ hEvent = hEvent == NULL
+ ? db_event_first(hContact)
+ : db_event_next(hContact, hEvent);
+
+ if (hEvent)
+ {
+ lua_pushinteger(L, hContact);
+ lua_pushvalue(L, -1);
+ lua_replace(L, lua_upvalueindex(2));
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+static int lua_AllEvents(lua_State *L)
+{
+ MCONTACT hContact = luaL_checkinteger(L, 1);
+
+ lua_pushinteger(L, hContact);
+ lua_pushinteger(L, NULL);
+ lua_pushcclosure(L, lua_EventIterator, 2);
+
+ return 1;
+}
+
+static int lua_EventReverseIterator(lua_State *L)
+{
+ MCONTACT hContact = luaL_checkinteger(L, lua_upvalueindex(1));
+ MEVENT hEvent = luaL_checkinteger(L, lua_upvalueindex(2));
+
+ hEvent = hEvent == NULL
+ ? db_event_last(hContact)
+ : db_event_prev(hContact, hEvent);
+
+ if (hEvent)
+ {
+ lua_pushinteger(L, hContact);
+ lua_pushvalue(L, -1);
+ lua_replace(L, lua_upvalueindex(2));
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+static int lua_AllEventsFromEnd(lua_State *L)
+{
+ MCONTACT hContact = luaL_checkinteger(L, 1);
+
+ lua_pushinteger(L, hContact);
+ lua_pushinteger(L, NULL);
+ lua_pushcclosure(L, lua_EventReverseIterator, 2);
+
+ return 1;
+}
+
+/***********************************************/
+
+static int lua_WriteSetting(lua_State *L)
{
MCONTACT hContact = lua_tointeger(L, 1);
LPCSTR szModule = luaL_checkstring(L, 2);
@@ -153,7 +253,7 @@ static int lua_WriteContactSetting(lua_State *L) return 1;
}
-static int lua_GetContactSetting(lua_State *L)
+static int lua_GetSetting(lua_State *L)
{
MCONTACT hContact = lua_tointeger(L, 1);
LPCSTR szModule = luaL_checkstring(L, 2);
@@ -200,7 +300,7 @@ static int lua_GetContactSetting(lua_State *L) typedef struct
{
- int arrlen;
+ int count;
char **pszSettingName;
}
enumDBSettingsParam;
@@ -211,17 +311,62 @@ static int SettingsEnumProc(const char* szSetting, LPARAM lParam) {
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);
+ p->count++;
+ p->pszSettingName = (char**)mir_realloc(p->pszSettingName, p->count * sizeof(char*));
+ p->pszSettingName[p->count - 1] = mir_strdup(szSetting);
}
return 0;
}
+static int lua_SettingIterator(lua_State *L)
+{
+ int i = lua_tointeger(L, lua_upvalueindex(1));
+ enumDBSettingsParam* param = (enumDBSettingsParam*)lua_touserdata(L, lua_upvalueindex(2));
+
+ if (i < param->count)
+ {
+ lua_pushinteger(L, (i + 1));
+ lua_replace(L, lua_upvalueindex(1));
+ lua_pushstring(L, ptrA(mir_utf8encode(param->pszSettingName[i])));
+ mir_free(param->pszSettingName[i]);
+ }
+ else
+ {
+ lua_pushnil(L);
+ mir_free(param->pszSettingName);
+ //mir_free(param);
+ }
+
+ return 1;
+}
+
+static int lua_AllSettings(lua_State *L)
+{
+ const char* szModule = luaL_checkstring(L, 1);
+ MCONTACT hContact = lua_tointeger(L, 2);
+
+ enumDBSettingsParam* param = (enumDBSettingsParam*)mir_alloc(sizeof(enumDBSettingsParam*));
+ param->count = 0;
+ param->pszSettingName = NULL;
+
+ DBCONTACTENUMSETTINGS dbces = { 0 };
+ dbces.pfnEnumProc = SettingsEnumProc;
+ dbces.szModule = szModule;
+ dbces.ofsSettings = 0;
+ dbces.lParam = (LPARAM)param;
+ ::CallService(MS_DB_CONTACT_ENUMSETTINGS, hContact, (LPARAM)&dbces);
+
+ lua_pushinteger(L, 0);
+ lua_pushlightuserdata(L, param);
+ lua_pushcclosure(L, lua_SettingIterator, 2);
+
+ return 1;
+}
+
static int lua_EnumSettings(lua_State *L)
{
- MCONTACT hContact = lua_tointeger(L, 1);
- LPCSTR szModule = luaL_checkstring(L, 2);
+ LPCSTR szModule = luaL_checkstring(L, 1);
+ MCONTACT hContact = lua_tointeger(L, 2);
if (!lua_isfunction(L, 3))
{
@@ -241,7 +386,7 @@ static int lua_EnumSettings(lua_State *L) dbces.lParam = (LPARAM)¶m;
INT_PTR res = ::CallService(MS_DB_CONTACT_ENUMSETTINGS, hContact, (LPARAM)&dbces);
- for (int i = 0; i < param.arrlen; i++)
+ for (int i = 0; i < param.count; i++)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
lua_pushstring(L, mir_utf8encode(param.pszSettingName[i]));
@@ -258,7 +403,7 @@ static int lua_EnumSettings(lua_State *L) return 1;
}
-static int lua_DeleteContactSetting(lua_State *L)
+static int lua_DeleteSetting(lua_State *L)
{
MCONTACT hContact = lua_tointeger(L, 1);
LPCSTR szModule = luaL_checkstring(L, 2);
@@ -333,7 +478,7 @@ static int SettingsChangedHookEventObjParam(void *obj, WPARAM wParam, LPARAM lPa return res;
}
-static int lua_OnContactSettingChanged(lua_State *L)
+static int lua_OnSettingChanged(lua_State *L)
{
if (!lua_isfunction(L, 1))
{
@@ -398,6 +543,7 @@ static luaL_Reg databaseApi[] = {
{ "FindFirstContact", lua_FindFirstContact },
{ "FindNextContact", lua_FindNextContact },
+ { "AllContacts", lua_AllContacts },
{ "GetEventCount", lua_GetEventCount },
@@ -405,18 +551,25 @@ static luaL_Reg databaseApi[] = { "GetPrevEvent", lua_GetPrevEvent },
{ "GetNextEvent", lua_GetNextEvent },
{ "GetLastEvent", lua_GetLastEvent },
+ { "AllEvents", lua_AllEvents },
+ { "GetEventsFromEnd", lua_AllEventsFromEnd },
{ "GetEvent", lua_GetEvent },
- { "WriteContactSetting", lua_WriteContactSetting },
+ { "WriteContactSetting", lua_WriteSetting },
+ { "WriteSetting", lua_WriteSetting },
- { "GetContactSetting", lua_GetContactSetting },
+ { "GetContactSetting", lua_GetSetting },
+ { "GetSetting", lua_GetSetting },
+ { "AllSettings", lua_AllSettings },
{ "EnumSettings", lua_EnumSettings },
- { "DeleteContactSetting", lua_DeleteContactSetting },
+ { "DeleteContactSetting", lua_DeleteSetting },
+ { "DeleteSetting", lua_DeleteSetting },
{ "DeleteModule", lua_DeleteModule },
- { "OnContactSettingChanged", lua_OnContactSettingChanged },
+ { "OnContactSettingChanged", lua_OnSettingChanged },
+ { "OnSettingChanged", lua_OnSettingChanged },
{ "DecodeDBCONTACTWRITESETTING", lua_DecodeDBCONTACTWRITESETTING },
{ NULL, NULL }
diff --git a/plugins/MirLua/src/m_protocols.cpp b/plugins/MirLua/src/m_protocols.cpp index 9e121b8a66..c095f44470 100644 --- a/plugins/MirLua/src/m_protocols.cpp +++ b/plugins/MirLua/src/m_protocols.cpp @@ -25,6 +25,38 @@ static int lua_GetProto(lua_State *L) return 1;
}
+static int lua_ProtoIterator(lua_State *L)
+{
+ int i = lua_tointeger(L, lua_upvalueindex(1));
+ int count = lua_tointeger(L, lua_upvalueindex(2));
+ PROTOCOLDESCRIPTOR** protos = (PROTOCOLDESCRIPTOR**)lua_touserdata(L, lua_upvalueindex(3));
+
+ if (i < count)
+ {
+ lua_pushinteger(L, (i + 1));
+ lua_replace(L, lua_upvalueindex(1));
+ MapToTable(L, protos[i]);
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+static int lua_AllProtos(lua_State *L)
+{
+ int count;
+ PROTOCOLDESCRIPTOR** protos;
+ Proto_EnumProtocols(&count, &protos);
+
+ lua_pushinteger(L, 0);
+ lua_pushinteger(L, count);
+ lua_pushlightuserdata(L, protos);
+ lua_pushcclosure(L, lua_ProtoIterator, 3);
+
+ return 1;
+}
+
static int lua_EnumProtos(lua_State *L)
{
if (!lua_isfunction(L, 1))
@@ -94,6 +126,38 @@ static int lua_GetAccount(lua_State *L) return 1;
}
+static int lua_AccountIterator(lua_State *L)
+{
+ int i = lua_tointeger(L, lua_upvalueindex(1));
+ int count = lua_tointeger(L, lua_upvalueindex(2));
+ PROTOACCOUNT** accounts = (PROTOACCOUNT**)lua_touserdata(L, lua_upvalueindex(3));
+
+ if (i < count)
+ {
+ lua_pushinteger(L, (i + 1));
+ lua_replace(L, lua_upvalueindex(1));
+ MapToTable(L, accounts[i]);
+ }
+ else
+ lua_pushnil(L);
+
+ return 1;
+}
+
+static int lua_AllAccounts(lua_State *L)
+{
+ int count;
+ PROTOACCOUNT** accounts;
+ Proto_EnumAccounts(&count, &accounts);
+
+ lua_pushinteger(L, 0);
+ lua_pushinteger(L, count);
+ lua_pushlightuserdata(L, accounts);
+ lua_pushcclosure(L, lua_AccountIterator, 3);
+
+ return 1;
+}
+
static int lua_EnumAccounts(lua_State *L)
{
if (!lua_isfunction(L, 1))
@@ -126,9 +190,11 @@ static int lua_EnumAccounts(lua_State *L) static luaL_Reg protocolsApi[] =
{
{ "GetProto", lua_GetProto },
+ { "AllProtos", lua_AllProtos },
{ "EnumProtos", lua_EnumProtos },
{ "GetAccount", lua_GetAccount },
+ { "AllAccounts", lua_AllAccounts },
{ "EnumAccounts", lua_EnumAccounts },
{ NULL, NULL }
diff --git a/plugins/MirLua/src/mlua_script_loader.cpp b/plugins/MirLua/src/mlua_script_loader.cpp index bdcca3c9f4..d26ccd1e90 100644 --- a/plugins/MirLua/src/mlua_script_loader.cpp +++ b/plugins/MirLua/src/mlua_script_loader.cpp @@ -20,7 +20,7 @@ void CLuaScriptLoader::RegisterScriptsFolder(const char *path) void CLuaScriptLoader::LoadScript(const TCHAR *path, int iGroup)
{
- CMLuaScript *script = new CMLuaScript(L, path, 0);
+ CMLuaScript *script = new CMLuaScript(L, path, iGroup);
g_mLua->Scripts.insert(script);
if (script->Load())
diff --git a/plugins/MirLua/src/mlua_script_loader.h b/plugins/MirLua/src/mlua_script_loader.h index 7088706387..d70d481f3a 100644 --- a/plugins/MirLua/src/mlua_script_loader.h +++ b/plugins/MirLua/src/mlua_script_loader.h @@ -11,8 +11,8 @@ private: void RegisterScriptsFolder(const char *path);
- void LoadScript(const TCHAR *path, int iGroup);
- void LoadScripts(const TCHAR *scriptDir, int iGroup);
+ void LoadScript(const TCHAR *path, int iGroup = 0);
+ void LoadScripts(const TCHAR *scriptDir, int iGroup = 0);
public:
static void Load(lua_State *L);
diff --git a/plugins/MirLua/src/version.h b/plugins/MirLua/src/version.h index 48f4e6cac3..e71e5aa79c 100644 --- a/plugins/MirLua/src/version.h +++ b/plugins/MirLua/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0
#define __MINOR_VERSION 11
#define __RELEASE_NUM 4
-#define __BUILD_NUM 0
+#define __BUILD_NUM 1
#include <stdver.h>
|