// shutdown action
void ShutdownAction(void)
{
    CriteriaStruct Criteria;
    Criteria.keep = KeepCriteria(db_get_b(NULL, ModuleName, "StartupShutdownKeep", 0));
    Criteria.time = BuildCriteria(db_get_b(NULL, ModuleName, "StartupShutdownOlder", 0));

    SweepHistoryFromContact(NULL, Criteria, FALSE);				// sweep system history, keepunread==0

    for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact))
        SweepHistoryFromContact(hContact, Criteria, TRUE);		// sweep contact history, keepunread==1
}
// shutdown action
void ShutdownAction(void)
{
	CriteriaStruct Criteria;
	Criteria.keep = KeepCriteria(db_get_b(NULL, ModuleName, "StartupShutdownKeep", 0));
	Criteria.time = BuildCriteria(db_get_b(NULL, ModuleName, "StartupShutdownOlder", 0));

	SweepHistoryFromContact(NULL, Criteria, FALSE);				// sweep system history, keepunread==0

	for (auto &hContact : Contacts())
		SweepHistoryFromContact(hContact, Criteria, TRUE);		// sweep contact history, keepunread==1
}
int OnWindowEvent(WPARAM wParam, LPARAM lParam)
{
    MessageWindowEventData* msgEvData = (MessageWindowEventData*)lParam;
    switch (msgEvData->uType) {
    case MSG_WINDOW_EVT_OPENING:
        g_hWindows.insert(PVOID(msgEvData->hContact));
        SetSrmmIcon(msgEvData->hContact);
        break;

    case MSG_WINDOW_EVT_CLOSE:
        if (db_get_b(NULL, ModuleName, "SweepOnClose", 0)) {
            CriteriaStruct Criteria;

            Criteria.keep = KeepCriteria(db_get_b(NULL, ModuleName, "StartupShutdownKeep", 0));
            Criteria.time = BuildCriteria(db_get_b(NULL, ModuleName, "StartupShutdownOlder", 0));

            SweepHistoryFromContact(msgEvData->hContact, Criteria, TRUE);
        }

        for (int i = g_hWindows.getCount() - 1; i >= 0; i--)
            if (g_hWindows[i] == PVOID(msgEvData->hContact))
                g_hWindows.remove(i);
        break;
    }

    return 0;
}
int OnWindowEvent(WPARAM, LPARAM lParam)
{
	MessageWindowEventData* msgEvData = (MessageWindowEventData*)lParam;
	switch (msgEvData->uType) {
	case MSG_WINDOW_EVT_OPENING:
		g_hWindows.insert(PVOID(msgEvData->hContact));
		SetSrmmIcon(msgEvData->hContact);
		break;

	case MSG_WINDOW_EVT_CLOSE:
		if (db_get_b(NULL, ModuleName, "SweepOnClose", 0)) {
			CriteriaStruct Criteria;

			Criteria.keep = KeepCriteria(db_get_b(NULL, ModuleName, "StartupShutdownKeep", 0));
			Criteria.time = BuildCriteria(db_get_b(NULL, ModuleName, "StartupShutdownOlder", 0));

			SweepHistoryFromContact(msgEvData->hContact, Criteria, TRUE);
		}

		auto T = g_hWindows.rev_iter();
		for (auto &it : T)
			if (it == PVOID(msgEvData->hContact))
				g_hWindows.remove(T.indexOf(&it));
		break;
	}

	return 0;
}
int OnWindowEvent(WPARAM wParam, LPARAM lParam)
{
	MessageWindowEventData* msgEvData  = (MessageWindowEventData*)lParam;

	if (msgEvData->uType == MSG_WINDOW_EVT_CLOSE && db_get_b(NULL, ModuleName, "SweepOnClose", 0))
	{
		CriteriaStruct Criteria;

		Criteria.keep = KeepCriteria(db_get_b(NULL, ModuleName, "StartupShutdownKeep", 0));
		Criteria.time = BuildCriteria(db_get_b(NULL, ModuleName, "StartupShutdownOlder", 0));

		SweepHistoryFromContact(msgEvData->hContact, Criteria, TRUE);
	}

	return 0;
}