/*
 * YAMN plugin export functions for protocols
 *
 * (c) majvan 2002-2004
 */

#include "stdafx.h"

 //--------------------------------------------------------------------------------------------------

YAMN_PROTOPLUGINQUEUE *FirstProtoPlugin = nullptr;

// Removes plugins from queue and deletes registration structures
INT_PTR UnregisterProtoPlugins();

//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------

YAMN_PROTOPLUGIN* RegisterProtocolPlugin(YAMN_PROTOREGISTRATION *Registration)
{
	if ((Registration->Name == nullptr) || (Registration->Ver == nullptr))
		return (INT_PTR)NULL;

	auto *Plugin = new YAMN_PROTOPLUGIN();
	Plugin->PluginInfo = Registration;
	return Plugin;
}

// Sets imported functions for an plugin and therefore it starts plugin to be registered and running
// Plugin- plugin, which wants to set its functions
// YAMNFcn- pointer to imported functions with accounts
// YAMNMailFcn- pointer to imported functions with mails
// returns nonzero if success

int SetProtocolPluginFcnImportFcn(YAMN_PROTOPLUGIN *Plugin, YAMN_PROTOIMPORTFCN *YAMNFcn, YAMN_MAILIMPORTFCN *YAMNMailFcn)
{
	if (YAMNFcn == nullptr || YAMNMailFcn == nullptr)
		return 0;

	Plugin->Fcn = YAMNFcn;
	Plugin->MailFcn = YAMNMailFcn;

	mir_cslock lck(PluginRegCS);

	// We add protocol to the protocol list
	YAMN_PROTOPLUGINQUEUE *Parser;
	for (Parser = FirstProtoPlugin; Parser != nullptr && Parser->Next != nullptr; Parser = Parser->Next);
	if (Parser == nullptr) {
		FirstProtoPlugin = new YAMN_PROTOPLUGINQUEUE;
		Parser = FirstProtoPlugin;
	}
	else {
		Parser->Next = new YAMN_PROTOPLUGINQUEUE;
		Parser = Parser->Next;
	}

	Parser->Plugin = Plugin;
	Parser->Next = nullptr;
	return 1;
}

int UnregisterProtocolPlugin(YAMN_PROTOPLUGIN *Plugin)
{
	mir_cslock lck(PluginRegCS);

	YAMN_PROTOPLUGINQUEUE *Parser, *Found;
	if (FirstProtoPlugin->Plugin == Plugin) {
		Found = FirstProtoPlugin;
		FirstProtoPlugin = FirstProtoPlugin->Next;
	}
	else {
		for (Parser = FirstProtoPlugin; (Parser->Next != nullptr) && (Plugin != Parser->Next->Plugin); Parser = Parser->Next);
		if (Parser->Next != nullptr) {
			Found = Parser->Next;
			Parser->Next = Parser->Next->Next;
		}
		else
			Found = nullptr;
	}
	
	if (!Found) 
		return 1;

	StopAccounts(Plugin);
	DeleteAccounts(Plugin);
	if (Plugin->Fcn->UnLoadFcn != nullptr)
		Plugin->Fcn->UnLoadFcn((void *)nullptr);

	delete Found->Plugin;
	delete Found;
	return 0;
}

INT_PTR UnregisterProtoPlugins()
{
	mir_cslock lck(PluginRegCS);
	// We remove protocols from the protocol list
	while (FirstProtoPlugin != nullptr)
		UnregisterProtocolPlugin(FirstProtoPlugin->Plugin);
	return 1;
}

CMStringW GetFileName(wchar_t *pwszPlugin)
{
	return CMStringW(FORMAT, L"%s\\yamn-accounts.%s.%s.book", UserDirectory, pwszPlugin, ProfileName);
}