/*
Copyright (C) 2017 Belledonne Communications SARL

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

#ifndef {{define}}
#define {{define}}

{{#includes}}
{{#external}}
#include <{{name}}>
{{/external}}
{{#internal}}
#include "{{name}}.hh"
{{/internal}}
{{/includes}}
#include "object.hh"

{{#_class}}{{#isVcard}}
#include <belcard/belcard.hpp>
{{/isVcard}}{{/_class}}
{{#_class}}{{#isfactory}}
#include "config.hh"
{{/isfactory}}{{/_class}}


{{#_class}}
{{#isNotListener}}
struct {{{privCClassName}}};
{{/isNotListener}}
{{/_class}}


namespace linphone {

	{{#priorDeclarations}}
	class {{{name}}};
	{{/priorDeclarations}}

	{{#_class}}
	{{#doc}}
	/**
	 {{#lines}}
	 * {{{line}}}
	 {{/lines}}
	 */
	{{/doc}}
	class {{className}}{{#parentClassName}}: public {{{parentClassName}}}{{/parentClassName}} {
		{{#friendClasses}}
		friend class {{name}};
		{{/friendClasses}}
	
		public:
			{{#isNotListener}}
			{{#isrefcountable}}
			{{{className}}}(void *ptr, bool takeRef=true);
			{{/isrefcountable}}
			{{#isnotrefcountable}}
			LINPHONECXX_PUBLIC {{{className}}}();
			LINPHONECXX_PUBLIC {{{className}}}(const {{{className}}} &src);
			{{{className}}}(const void *src);
			LINPHONECXX_PUBLIC ~{{{className}}}();
			LINPHONECXX_PUBLIC const void *c_struct() const {return mPrivPtr;}
			{{/isnotrefcountable}}
			LINPHONECXX_PUBLIC {{{privCClassName}}} *cPtr() {return ({{{privCClassName}}} *)mPrivPtr;}
			{{/isNotListener}}
			
			{{#ismonolistenable}}
			LINPHONECXX_PUBLIC void setListener(const std::shared_ptr<{{{listenerClassName}}}> &listener);
			{{/ismonolistenable}}

			{{#ismultilistenable}}
			LINPHONECXX_PUBLIC virtual ~{{{className}}}();
			LINPHONECXX_PUBLIC void addListener(const std::shared_ptr<{{{listenerClassName}}}> &listener);
			LINPHONECXX_PUBLIC void removeListener(const std::shared_ptr<{{{listenerClassName}}}> &listener);
			{{/ismultilistenable}}
	
		public:
			{{#isfactory}}
			LINPHONECXX_PUBLIC std::shared_ptr<Core> createCore(const std::shared_ptr<CoreListener> &listener, const std::string & configPath, const std::string & factoryConfigPath) const;
			LINPHONECXX_PUBLIC std::shared_ptr<Core> createCoreWithConfig(const std::shared_ptr<CoreListener> &listener, const std::shared_ptr<Config> & config) const;
			{{/isfactory}}
			{{#isVcard}}
			LINPHONECXX_PUBLIC std::shared_ptr<belcard::BelCard> &getVcard();
			{{/isVcard}}
			
		
			{{#methods}}
			{{#doc}}
			/**
			 {{#lines}}
			 * {{{line}}}
			 {{/lines}}
			 */
			{{/doc}}
			{{{prototype}}}
			
			{{/methods}}
			{{#staticMethods}}
			{{#doc}}
			/**
			 {{#lines}}
			 * {{{line}}}
			 {{/lines}}
			 */
			{{/doc}}
			{{{prototype}}}
			
			{{/staticMethods}}

		{{#ismultilistenable}}
		private:
			static void *createCallbacks(void *userData);
		{{/ismultilistenable}}
		
		
		{{#ismultilistenable}}
		private:
			void *mCallbacks;
		{{/ismultilistenable}}
		
		{{#isnotrefcountable}}
		private:
			void *mPrivPtr;
		{{/isnotrefcountable}}
	};
	{{/_class}}

};

#endif // {{define}}
