Browse Source

Merge branch 'fix-uwp' of https://github.com/paullouisageneau/libdatachannel into fix-uwp

Hanseul Jun 4 years ago
parent
commit
6221855f27

+ 1 - 465
examples/client/getopt.cpp

@@ -21,6 +21,7 @@ Revisions:
 08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi
 10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features
 06/19/2015 - Ludvik Jerabek - Fixed maximum option limitation caused by option_a (255) and option_w (65535) structure val variable
+24/10/2020 - Paul-Louis Ageneau - Removed Unicode version
 
 **DISCLAIMER**
 THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
@@ -52,12 +53,6 @@ int opterr = 1;
 int optopt = '?';
 enum ENUM_ORDERING { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER };
 
-//
-//
-//		Ansi structures and functions follow
-// 
-//
-
 static struct _getopt_data_a
 {
 	int optind;
@@ -512,462 +507,3 @@ int _getopt_long_only_r_a (int argc, char *const *argv, const char *options, con
 	return _getopt_internal_r_a (argc, argv, options, long_options, opt_index, 1, d, 0);
 }
 
-//
-//
-//	Unicode Structures and Functions
-// 
-//
-
-static struct _getopt_data_w
-{
-	int optind;
-	int opterr;
-	int optopt;
-	wchar_t *optarg;
-	int __initialized;
-	wchar_t *__nextchar;
-	enum ENUM_ORDERING __ordering;
-	int __posixly_correct;
-	int __first_nonopt;
-	int __last_nonopt;
-} getopt_data_w;
-wchar_t *optarg_w;
-
-static void exchange_w(wchar_t **argv, struct _getopt_data_w *d)
-{
-	int bottom = d->__first_nonopt;
-	int middle = d->__last_nonopt;
-	int top = d->optind;
-	wchar_t *tem;
-	while (top > middle && middle > bottom)
-	{
-		if (top - middle > middle - bottom)
-		{
-			int len = middle - bottom;
-			int i;
-			for (i = 0; i < len; i++)
-			{
-				tem = argv[bottom + i];
-				argv[bottom + i] = argv[top - (middle - bottom) + i];
-				argv[top - (middle - bottom) + i] = tem;
-			}
-			top -= len;
-		}
-		else
-		{
-			int len = top - middle;
-			int i;
-			for (i = 0; i < len; i++)
-			{
-				tem = argv[bottom + i];
-				argv[bottom + i] = argv[middle + i];
-				argv[middle + i] = tem;
-			}
-			bottom += len;
-		}
-	}
-	d->__first_nonopt += (d->optind - d->__last_nonopt);
-	d->__last_nonopt = d->optind;
-}
-static const wchar_t *_getopt_initialize_w (const wchar_t *optstring, struct _getopt_data_w *d, int posixly_correct)
-{
-	d->__first_nonopt = d->__last_nonopt = d->optind;
-	d->__nextchar = NULL;
-	d->__posixly_correct = posixly_correct | !!_wgetenv(L"POSIXLY_CORRECT");
-	if (optstring[0] == L'-')
-	{
-		d->__ordering = RETURN_IN_ORDER;
-		++optstring;
-	}
-	else if (optstring[0] == L'+')
-	{
-		d->__ordering = REQUIRE_ORDER;
-		++optstring;
-	}
-	else if (d->__posixly_correct)
-		d->__ordering = REQUIRE_ORDER;
-	else
-		d->__ordering = PERMUTE;
-	return optstring;
-}
-int _getopt_internal_r_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, struct _getopt_data_w *d, int posixly_correct)
-{
-	int print_errors = d->opterr;
-	if (argc < 1)
-		return -1;
-	d->optarg = NULL;
-	if (d->optind == 0 || !d->__initialized)
-	{
-		if (d->optind == 0)
-			d->optind = 1;
-		optstring = _getopt_initialize_w (optstring, d, posixly_correct);
-		d->__initialized = 1;
-	}
-	else if (optstring[0] == L'-' || optstring[0] == L'+')
-		optstring++;
-	if (optstring[0] == L':')
-		print_errors = 0;
-	if (d->__nextchar == NULL || *d->__nextchar == L'\0')
-	{
-		if (d->__last_nonopt > d->optind)
-			d->__last_nonopt = d->optind;
-		if (d->__first_nonopt > d->optind)
-			d->__first_nonopt = d->optind;
-		if (d->__ordering == PERMUTE)
-		{
-			if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
-				exchange_w((wchar_t **) argv, d);
-			else if (d->__last_nonopt != d->optind)
-				d->__first_nonopt = d->optind;
-			while (d->optind < argc && (argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0'))
-				d->optind++;
-			d->__last_nonopt = d->optind;
-		}
-		if (d->optind != argc && !wcscmp(argv[d->optind], L"--"))
-		{
-			d->optind++;
-			if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind)
-				exchange_w((wchar_t **) argv, d);
-			else if (d->__first_nonopt == d->__last_nonopt)
-				d->__first_nonopt = d->optind;
-			d->__last_nonopt = argc;
-			d->optind = argc;
-		}
-		if (d->optind == argc)
-		{
-			if (d->__first_nonopt != d->__last_nonopt)
-				d->optind = d->__first_nonopt;
-			return -1;
-		}
-		if ((argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0'))
-		{
-			if (d->__ordering == REQUIRE_ORDER)
-				return -1;
-			d->optarg = argv[d->optind++];
-			return 1;
-		}
-		d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == L'-'));
-	}
-	if (longopts != NULL && (argv[d->optind][1] == L'-' || (long_only && (argv[d->optind][2] || !wcschr(optstring, argv[d->optind][1])))))
-	{
-		wchar_t *nameend;
-		unsigned int namelen;
-		const struct option_w *p;
-		const struct option_w *pfound = NULL;
-		struct option_list
-		{
-			const struct option_w *p;
-			struct option_list *next;
-		} *ambig_list = NULL;
-		int exact = 0;
-		int indfound = -1;
-		int option_index;
-		for (nameend = d->__nextchar; *nameend && *nameend != L'='; nameend++);
-		namelen = (unsigned int)(nameend - d->__nextchar);
-		for (p = longopts, option_index = 0; p->name; p++, option_index++)
-			if (!wcsncmp(p->name, d->__nextchar, namelen))
-			{
-				if (namelen == (unsigned int)wcslen(p->name))
-				{
-					pfound = p;
-					indfound = option_index;
-					exact = 1;
-					break;
-				}
-				else if (pfound == NULL)
-				{
-					pfound = p;
-					indfound = option_index;
-				}
-				else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
-				{
-					struct option_list *newp = (struct option_list*)alloca(sizeof(*newp));
-					newp->p = p;
-					newp->next = ambig_list;
-					ambig_list = newp;
-				}
-			}
-			if (ambig_list != NULL && !exact)
-			{
-				if (print_errors)
-				{						
-					struct option_list first;
-					first.p = pfound;
-					first.next = ambig_list;
-					ambig_list = &first;
-					fwprintf(stderr, L"%s: option '%s' is ambiguous; possibilities:", argv[0], argv[d->optind]);
-					do
-					{
-						fwprintf (stderr, L" '--%s'", ambig_list->p->name);
-						ambig_list = ambig_list->next;
-					}
-					while (ambig_list != NULL);
-					fputwc (L'\n', stderr);
-				}
-				d->__nextchar += wcslen(d->__nextchar);
-				d->optind++;
-				d->optopt = 0;
-				return L'?';
-			}
-			if (pfound != NULL)
-			{
-				option_index = indfound;
-				d->optind++;
-				if (*nameend)
-				{
-					if (pfound->has_arg)
-						d->optarg = nameend + 1;
-					else
-					{
-						if (print_errors)
-						{
-							if (argv[d->optind - 1][1] == L'-')
-							{
-								fwprintf(stderr, L"%s: option '--%s' doesn't allow an argument\n",argv[0], pfound->name);
-							}
-							else
-							{
-								fwprintf(stderr, L"%s: option '%c%s' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name);
-							}
-						}
-						d->__nextchar += wcslen(d->__nextchar);
-						d->optopt = pfound->val;
-						return L'?';
-					}
-				}
-				else if (pfound->has_arg == 1)
-				{
-					if (d->optind < argc)
-						d->optarg = argv[d->optind++];
-					else
-					{
-						if (print_errors)
-						{
-							fwprintf(stderr,L"%s: option '--%s' requires an argument\n",argv[0], pfound->name);
-						}
-						d->__nextchar += wcslen(d->__nextchar);
-						d->optopt = pfound->val;
-						return optstring[0] == L':' ? L':' : L'?';
-					}
-				}
-				d->__nextchar += wcslen(d->__nextchar);
-				if (longind != NULL)
-					*longind = option_index;
-				if (pfound->flag)
-				{
-					*(pfound->flag) = pfound->val;
-					return 0;
-				}
-				return pfound->val;
-			}
-			if (!long_only || argv[d->optind][1] == L'-' || wcschr(optstring, *d->__nextchar) == NULL)
-			{
-				if (print_errors)
-				{
-					if (argv[d->optind][1] == L'-')
-					{
-						fwprintf(stderr, L"%s: unrecognized option '--%s'\n",argv[0], d->__nextchar);
-					}
-					else
-					{
-						fwprintf(stderr, L"%s: unrecognized option '%c%s'\n",argv[0], argv[d->optind][0], d->__nextchar);
-					}
-				}
-				d->__nextchar = (wchar_t *)L"";
-				d->optind++;
-				d->optopt = 0;
-				return L'?';
-			}
-	}
-	{
-		wchar_t c = *d->__nextchar++;
-		wchar_t *temp = (wchar_t*)wcschr(optstring, c);
-		if (*d->__nextchar == L'\0')
-			++d->optind;
-		if (temp == NULL || c == L':' || c == L';')
-		{
-			if (print_errors)
-			{
-				fwprintf(stderr, L"%s: invalid option -- '%c'\n", argv[0], c);
-			}
-			d->optopt = c;
-			return L'?';
-		}
-		if (temp[0] == L'W' && temp[1] == L';')
-		{
-			wchar_t *nameend;
-			const struct option_w *p;
-			const struct option_w *pfound = NULL;
-			int exact = 0;
-			int ambig = 0;
-			int indfound = 0;
-			int option_index;
-			if (longopts == NULL)
-				goto no_longs;
-			if (*d->__nextchar != L'\0')
-			{
-				d->optarg = d->__nextchar;
-				d->optind++;
-			}
-			else if (d->optind == argc)
-			{
-				if (print_errors)
-				{
-					fwprintf(stderr,L"%s: option requires an argument -- '%c'\n",argv[0], c);
-				}
-				d->optopt = c;
-				if (optstring[0] == L':')
-					c = L':';
-				else
-					c = L'?';
-				return c;
-			}
-			else
-				d->optarg = argv[d->optind++];
-			for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != L'='; nameend++);
-			for (p = longopts, option_index = 0; p->name; p++, option_index++)
-				if (!wcsncmp(p->name, d->__nextchar, nameend - d->__nextchar))
-				{
-					if ((unsigned int) (nameend - d->__nextchar) == wcslen(p->name))
-					{
-						pfound = p;
-						indfound = option_index;
-						exact = 1;
-						break;
-					}
-					else if (pfound == NULL)
-					{
-						pfound = p;
-						indfound = option_index;
-					}
-					else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val)
-						ambig = 1;
-				}
-				if (ambig && !exact)
-				{
-					if (print_errors)
-					{
-						fwprintf(stderr, L"%s: option '-W %s' is ambiguous\n",argv[0], d->optarg);
-					}
-					d->__nextchar += wcslen(d->__nextchar);
-					d->optind++;
-					return L'?';
-				}
-				if (pfound != NULL)
-				{
-					option_index = indfound;
-					if (*nameend)
-					{
-						if (pfound->has_arg)
-							d->optarg = nameend + 1;
-						else
-						{
-							if (print_errors)
-							{
-								fwprintf(stderr, L"%s: option '-W %s' doesn't allow an argument\n",argv[0], pfound->name);
-							}
-							d->__nextchar += wcslen(d->__nextchar);
-							return L'?';
-						}
-					}
-					else if (pfound->has_arg == 1)
-					{
-						if (d->optind < argc)
-							d->optarg = argv[d->optind++];
-						else
-						{
-							if (print_errors)
-							{
-								fwprintf(stderr, L"%s: option '-W %s' requires an argument\n",argv[0], pfound->name);
-							}
-							d->__nextchar += wcslen(d->__nextchar);
-							return optstring[0] == L':' ? L':' : L'?';
-						}
-					}
-					else
-						d->optarg = NULL;
-					d->__nextchar += wcslen(d->__nextchar);
-					if (longind != NULL)
-						*longind = option_index;
-					if (pfound->flag)
-					{
-						*(pfound->flag) = pfound->val;
-						return 0;
-					}
-					return pfound->val;
-				}
-no_longs:
-				d->__nextchar = NULL;
-				return L'W';
-		}
-		if (temp[1] == L':')
-		{
-			if (temp[2] == L':')
-			{
-				if (*d->__nextchar != L'\0')
-				{
-					d->optarg = d->__nextchar;
-					d->optind++;
-				}
-				else
-					d->optarg = NULL;
-				d->__nextchar = NULL;
-			}
-			else
-			{
-				if (*d->__nextchar != L'\0')
-				{
-					d->optarg = d->__nextchar;
-					d->optind++;
-				}
-				else if (d->optind == argc)
-				{
-					if (print_errors)
-					{
-						fwprintf(stderr,L"%s: option requires an argument -- '%c'\n",argv[0], c);
-					}
-					d->optopt = c;
-					if (optstring[0] == L':')
-						c = L':';
-					else
-						c = L'?';
-				}
-				else
-					d->optarg = argv[d->optind++];
-				d->__nextchar = NULL;
-			}
-		}
-		return c;
-	}
-}
-int _getopt_internal_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, int posixly_correct)
-{
-	int result;
-	getopt_data_w.optind = optind;
-	getopt_data_w.opterr = opterr;
-	result = _getopt_internal_r_w (argc, argv, optstring, longopts,longind, long_only, &getopt_data_w,posixly_correct);
-	optind = getopt_data_w.optind;
-	optarg_w = getopt_data_w.optarg;
-	optopt = getopt_data_w.optopt;
-	return result;
-}
-int getopt_w (int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW
-{
-	return _getopt_internal_w (argc, argv, optstring, (const struct option_w *) 0, (int *) 0, 0, 0);
-}
-int getopt_long_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW
-{
-	return _getopt_internal_w (argc, argv, options, long_options, opt_index, 0, 0);
-}
-int getopt_long_only_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW
-{
-	return _getopt_internal_w (argc, argv, options, long_options, opt_index, 1, 0);
-}
-int _getopt_long_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d)
-{
-	return _getopt_internal_r_w (argc, argv, options, long_options, opt_index,0, d, 0);
-}
-int _getopt_long_only_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d)
-{
-	return _getopt_internal_r_w (argc, argv, options, long_options, opt_index, 1, d, 0);
-}

+ 7 - 28
examples/client/getopt.h

@@ -21,6 +21,7 @@ Revisions:
 08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi
 10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features
 06/19/2015 - Ludvik Jerabek - Fixed maximum option limitation caused by option_a (255) and option_w (65535) structure val variable
+24/10/2020 - Paul-Louis Ageneau - Removed Unicode version
 
 **DISCLAIMER**
 THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
@@ -79,7 +80,6 @@ EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 	#define ARG_OPT		2	/*Argument Optional*/
 
 	#include <string.h>
-	#include <wchar.h>
 
 _BEGIN_EXTERN_C
 
@@ -87,7 +87,6 @@ _BEGIN_EXTERN_C
 	extern _GETOPT_API int opterr;
 	extern _GETOPT_API int optopt;
 
-	// Ansi
 	struct option_a
 	{
 		const char* name;
@@ -100,19 +99,6 @@ _BEGIN_EXTERN_C
 	extern _GETOPT_API int getopt_long_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW;
 	extern _GETOPT_API int getopt_long_only_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW;
 
-	// Unicode
-	struct option_w
-	{
-		const wchar_t* name;
-		int has_arg;
-		int *flag;
-		int val;
-	};
-	extern _GETOPT_API wchar_t *optarg_w;
-	extern _GETOPT_API int getopt_w(int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW;
-	extern _GETOPT_API int getopt_long_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW;
-	extern _GETOPT_API int getopt_long_only_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW;	
-	
 _END_EXTERN_C
 
 	#undef _BEGIN_EXTERN_C
@@ -120,17 +106,10 @@ _END_EXTERN_C
 	#undef _GETOPT_THROW
 	#undef _GETOPT_API
 
-	#ifdef _UNICODE
-		#define getopt getopt_w
-		#define getopt_long getopt_long_w
-		#define getopt_long_only getopt_long_only_w
-		#define option option_w
-		#define optarg optarg_w
-	#else
-		#define getopt getopt_a
-		#define getopt_long getopt_long_a
-		#define getopt_long_only getopt_long_only_a
-		#define option option_a
-		#define optarg optarg_a
-	#endif
+	#define getopt getopt_a
+	#define getopt_long getopt_long_a
+	#define getopt_long_only getopt_long_only_a
+	#define option option_a
+	#define optarg optarg_a
+
 #endif  // __GETOPT_H_

+ 177 - 181
examples/copy-paste-capi/answerer.c

@@ -34,23 +34,23 @@ static void sleep(unsigned int secs) { Sleep(secs * 1000); }
 #endif
 
 typedef struct {
-        rtcState state;
-        rtcGatheringState gatheringState;
-        int pc;
-        int dc;
-        bool connected;
+	rtcState state;
+	rtcGatheringState gatheringState;
+	int pc;
+	int dc;
+	bool connected;
 } Peer;
 
-static void dataChannelCallback(int pc, int dc, void *ptr);
-static void descriptionCallback(int pc, const char *sdp, const char *type, void *ptr);
-static void candidateCallback(int pc, const char *cand, const char *mid, void *ptr);
-static void stateChangeCallback(int pc, rtcState state, void *ptr);
-static void gatheringStateCallback(int pc, rtcGatheringState state, void *ptr);
-static void closedCallback(int id, void *ptr);
-static void messageCallback(int id, const char *message, int size, void *ptr);
-static void deletePeer(Peer *peer);
+static void RTC_API dataChannelCallback(int pc, int dc, void *ptr);
+static void RTC_API descriptionCallback(int pc, const char *sdp, const char *type, void *ptr);
+static void RTC_API candidateCallback(int pc, const char *cand, const char *mid, void *ptr);
+static void RTC_API stateChangeCallback(int pc, rtcState state, void *ptr);
+static void RTC_API gatheringStateCallback(int pc, rtcGatheringState state, void *ptr);
+static void RTC_API closedCallback(int id, void *ptr);
+static void RTC_API messageCallback(int id, const char *message, int size, void *ptr);
+static void RTC_API deletePeer(Peer *peer);
 
-char* state_print(rtcState state);
+char *state_print(rtcState state);
 char *rtcGatheringState_print(rtcGatheringState state);
 
 int all_space(const char *str);
@@ -66,189 +66,185 @@ int main(int argc, char **argv) {
 	if (!peer) {
 		fprintf(stderr, "Error allocating memory for peer\n");
 		return -1;
-	    }
-        memset(peer, 0, sizeof(Peer));
-
-        printf("Peer created\n");
-
-        // Create peer connection
-        peer->pc = rtcCreatePeerConnection(&config);
-
-        rtcSetUserPointer(peer->pc, peer);
-        rtcSetLocalDescriptionCallback(peer->pc, descriptionCallback);
-        rtcSetLocalCandidateCallback(peer->pc, candidateCallback);
-        rtcSetStateChangeCallback(peer->pc, stateChangeCallback);
-        rtcSetGatheringStateChangeCallback(peer->pc, gatheringStateCallback);
-
-        rtcSetUserPointer(peer->dc, NULL);
-        rtcSetDataChannelCallback(peer->pc, dataChannelCallback);
-
-	    sleep(1);
-
-	    bool exit = false;
-        while (!exit) {
-                printf("\n");
-                printf("***************************************************************************************\n");
-                printf("* 0: Exit /"
-                       " 1: Enter remote description /"
-                       " 2: Enter remote candidate /"
-                       " 3: Send message /"
-                       " 4: Print Connection Info *\n"
-                       "[Command]: ");
-
-                int command = -1;
-                int c;
-
-		        if (!scanf("%d", &command)) {
-			        break;
-		        }
-
-		        while ((c = getchar()) != '\n' && c != EOF) {
-		        }
-		        fflush(stdin);
-
-		        switch (command) {
-                case 0: {
-                        exit = true;
-                        break;
-                }
-                case 1: {
-                        // Parse Description
-                        printf("[Description]: ");
-                        char *line = NULL;
-                        size_t len = 0;
-                        size_t read = 0;
-                        char *sdp = (char*) malloc(sizeof(char));
-                        while ((read = getline(&line, &len, stdin)) != -1 && !all_space(line)) {
-                                sdp = (char*) realloc (sdp,(strlen(sdp)+1) +strlen(line)+1);
-                                strcat(sdp, line);
-
-                        }
-                        printf("%s\n",sdp);
-                        rtcSetRemoteDescription(peer->pc, sdp, "offer");
-                        free(sdp);
-                        free(line);
-                        break;
-
-                }
-                case 2: {
-                        // Parse Candidate
-                        printf("[Candidate]: ");
-                        char* candidate = NULL;
-                        size_t candidate_size = 0;
-
-                        if(getline(&candidate, &candidate_size, stdin)) {
-                                rtcAddRemoteCandidate(peer->pc, candidate, "0");
-                                free(candidate);
-
-			            } else {
-				            printf("Error reading line\n");
-				            break;
-			            }
-
-			            break;
-                }
-                case 3: {
-                        // Send Message
-                        if(!peer->connected) {
-                                printf("** Channel is not Open **");
-                                break;
-                        }
-                        printf("[Message]: ");
-                        char* message = NULL;
-                        size_t message_size = 0;
-
-                        if(getline(&message, &message_size, stdin)) {
-                                rtcSendMessage(peer->dc, message, -1);
-                                free(message);
-			            } else {
-				            printf("Error reading line\n");
-				            break;
-			            }
-			            break;
-                }
-                case 4: {
-                        // Connection Info
-                        if(!peer->connected) {
-                                printf("** Channel is not Open **");
-                                break;
-                        }
-                        char buffer[256];
-                        if (rtcGetLocalAddress(peer->pc, buffer, 256) >= 0)
-                                printf("Local address 1:  %s\n", buffer);
-                        if (rtcGetRemoteAddress(peer->pc, buffer, 256) >= 0)
-                                printf("Remote address 1: %s\n", buffer);
-
-                        else
-                                printf("Could not get Candidate Pair Info\n");
-                        break;
-                }
-                default: {
-                        printf("** Invalid Command **");
-                        break;
-                }
-                }
-        }
-
-        deletePeer(peer);
-        return 0;
-}
+	}
+	memset(peer, 0, sizeof(Peer));
+
+	printf("Peer created\n");
+
+	// Create peer connection
+	peer->pc = rtcCreatePeerConnection(&config);
+
+	rtcSetUserPointer(peer->pc, peer);
+	rtcSetLocalDescriptionCallback(peer->pc, descriptionCallback);
+	rtcSetLocalCandidateCallback(peer->pc, candidateCallback);
+	rtcSetStateChangeCallback(peer->pc, stateChangeCallback);
+	rtcSetGatheringStateChangeCallback(peer->pc, gatheringStateCallback);
+
+	rtcSetUserPointer(peer->dc, NULL);
+	rtcSetDataChannelCallback(peer->pc, dataChannelCallback);
+
+	sleep(1);
 
-static void descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
-        // Peer *peer = (Peer *)ptr;
-        printf("Description %s:\n%s\n", "answerer", sdp);
+	bool exit = false;
+	while (!exit) {
+		printf("\n");
+		printf("***********************************************************************************"
+		       "****\n");
+		printf("* 0: Exit /"
+		       " 1: Enter remote description /"
+		       " 2: Enter remote candidate /"
+		       " 3: Send message /"
+		       " 4: Print Connection Info *\n"
+		       "[Command]: ");
+
+		int command = -1;
+		int c;
+
+		if (!scanf("%d", &command)) {
+			break;
+		}
+
+		while ((c = getchar()) != '\n' && c != EOF) {
+		}
+		fflush(stdin);
+
+		switch (command) {
+		case 0: {
+			exit = true;
+			break;
+		}
+		case 1: {
+			// Parse Description
+			printf("[Description]: ");
+			char *line = NULL;
+			size_t len = 0;
+			size_t read = 0;
+			char *sdp = (char *)malloc(sizeof(char));
+			while ((read = getline(&line, &len, stdin)) != -1 && !all_space(line)) {
+				sdp = (char *)realloc(sdp, (strlen(sdp) + 1) + strlen(line) + 1);
+				strcat(sdp, line);
+			}
+			printf("%s\n", sdp);
+			rtcSetRemoteDescription(peer->pc, sdp, "offer");
+			free(sdp);
+			free(line);
+			break;
+		}
+		case 2: {
+			// Parse Candidate
+			printf("[Candidate]: ");
+			char *candidate = NULL;
+			size_t candidate_size = 0;
+
+			if (getline(&candidate, &candidate_size, stdin)) {
+				rtcAddRemoteCandidate(peer->pc, candidate, "0");
+				free(candidate);
+
+			} else {
+				printf("Error reading line\n");
+				break;
+			}
+
+			break;
+		}
+		case 3: {
+			// Send Message
+			if (!peer->connected) {
+				printf("** Channel is not Open **");
+				break;
+			}
+			printf("[Message]: ");
+			char *message = NULL;
+			size_t message_size = 0;
+
+			if (getline(&message, &message_size, stdin)) {
+				rtcSendMessage(peer->dc, message, -1);
+				free(message);
+			} else {
+				printf("Error reading line\n");
+				break;
+			}
+			break;
+		}
+		case 4: {
+			// Connection Info
+			if (!peer->connected) {
+				printf("** Channel is not Open **");
+				break;
+			}
+			char buffer[256];
+			if (rtcGetLocalAddress(peer->pc, buffer, 256) >= 0)
+				printf("Local address 1:  %s\n", buffer);
+			if (rtcGetRemoteAddress(peer->pc, buffer, 256) >= 0)
+				printf("Remote address 1: %s\n", buffer);
+
+			else
+				printf("Could not get Candidate Pair Info\n");
+			break;
+		}
+		default: {
+			printf("** Invalid Command **");
+			break;
+		}
+		}
+	}
+
+	deletePeer(peer);
+	return 0;
 }
 
-static void candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
-        // Peer *peer = (Peer *)ptr;
-        printf("Candidate %s: %s\n", "answerer", cand);
+static void RTC_API descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
+	printf("Description %s:\n%s\n", "answerer", sdp);
+}
 
+static void RTC_API candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
+	printf("Candidate %s: %s\n", "answerer", cand);
 }
 
-static void stateChangeCallback(int pc, rtcState state, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->state = state;
-        printf("State %s: %s\n", "answerer", state_print(state));
+static void RTC_API stateChangeCallback(int pc, rtcState state, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->state = state;
+	printf("State %s: %s\n", "answerer", state_print(state));
 }
 
-static void gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->gatheringState = state;
-        printf("Gathering state %s: %s\n", "answerer", rtcGatheringState_print(state));
+static void RTC_API gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->gatheringState = state;
+	printf("Gathering state %s: %s\n", "answerer", rtcGatheringState_print(state));
 }
 
-static void closedCallback(int id, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->connected = false;
+static void RTC_API closedCallback(int id, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->connected = false;
 }
 
-static void messageCallback(int id, const char *message, int size, void *ptr) {
-        if (size < 0) { // negative size indicates a null-terminated string
-                printf("Message %s: %s\n", "answerer", message);
-        } else {
-                printf("Message %s: [binary of size %d]\n", "answerer", size);
-        }
+static void RTC_API messageCallback(int id, const char *message, int size, void *ptr) {
+	if (size < 0) { // negative size indicates a null-terminated string
+		printf("Message %s: %s\n", "answerer", message);
+	} else {
+		printf("Message %s: [binary of size %d]\n", "answerer", size);
+	}
 }
 
-static void deletePeer(Peer *peer) {
-        if (peer) {
-                if (peer->dc)
-                        rtcDeleteDataChannel(peer->dc);
-                if (peer->pc)
-                        rtcDeletePeerConnection(peer->pc);
-                free(peer);
-        }
+static void RTC_API dataChannelCallback(int pc, int dc, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->dc = dc;
+	peer->connected = true;
+	rtcSetClosedCallback(dc, closedCallback);
+	rtcSetMessageCallback(dc, messageCallback);
+	char buffer[256];
+	if (rtcGetDataChannelLabel(dc, buffer, 256) >= 0)
+		printf("DataChannel %s: Received with label \"%s\"\n", "answerer", buffer);
 }
 
-static void dataChannelCallback(int pc, int dc, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->dc = dc;
-        peer->connected = true;
-        rtcSetClosedCallback(dc, closedCallback);
-        rtcSetMessageCallback(dc, messageCallback);
-        char buffer[256];
-        if (rtcGetDataChannelLabel(dc, buffer, 256) >= 0)
-                printf("DataChannel %s: Received with label \"%s\"\n", "answerer", buffer);
+static void deletePeer(Peer *peer) {
+	if (peer) {
+		if (peer->dc)
+			rtcDeleteDataChannel(peer->dc);
+		if (peer->pc)
+			rtcDeletePeerConnection(peer->pc);
+		free(peer);
+	}
 }
 
 char *state_print(rtcState state) {

+ 176 - 183
examples/copy-paste-capi/offerer.c

@@ -34,28 +34,28 @@ static void sleep(unsigned int secs) { Sleep(secs * 1000); }
 #endif
 
 typedef struct {
-        rtcState state;
-        rtcGatheringState gatheringState;
-        int pc;
-        int dc;
-        bool connected;
+	rtcState state;
+	rtcGatheringState gatheringState;
+	int pc;
+	int dc;
+	bool connected;
 } Peer;
 
-static void descriptionCallback(int pc, const char *sdp, const char *type, void *ptr);
-static void candidateCallback(int pc, const char *cand, const char *mid, void *ptr);
-static void stateChangeCallback(int pc, rtcState state, void *ptr);
-static void gatheringStateCallback(int pc, rtcGatheringState state, void *ptr);
-static void openCallback(int id, void *ptr);
-static void closedCallback(int id, void *ptr);
-static void messageCallback(int id, const char *message, int size, void *ptr);
-static void deletePeer(Peer *peer);
+static void RTC_API descriptionCallback(int pc, const char *sdp, const char *type, void *ptr);
+static void RTC_API candidateCallback(int pc, const char *cand, const char *mid, void *ptr);
+static void RTC_API stateChangeCallback(int pc, rtcState state, void *ptr);
+static void RTC_API gatheringStateCallback(int pc, rtcGatheringState state, void *ptr);
+static void RTC_API openCallback(int id, void *ptr);
+static void RTC_API closedCallback(int id, void *ptr);
+static void RTC_API messageCallback(int id, const char *message, int size, void *ptr);
+static void RTC_API deletePeer(Peer *peer);
 
 char *state_print(rtcState state);
 char *rtcGatheringState_print(rtcGatheringState state);
 
 int all_space(const char *str);
 
-int main(int argc, char **argv){
+int main(int argc, char **argv) {
 	rtcInitLogger(RTC_LOG_DEBUG, NULL);
 
 	// Create peer
@@ -66,192 +66,185 @@ int main(int argc, char **argv){
 	if (!peer) {
 		fprintf(stderr, "Error allocating memory for peer\n");
 		return -1;
-	    }
-	    memset(peer, 0, sizeof(Peer));
-
-        printf("Peer created\n");
-
-        // Create peer connection
-        peer->pc = rtcCreatePeerConnection(&config);
-        rtcSetUserPointer(peer->pc, peer);
-        rtcSetLocalDescriptionCallback(peer->pc, descriptionCallback);
-        rtcSetLocalCandidateCallback(peer->pc, candidateCallback);
-        rtcSetStateChangeCallback(peer->pc, stateChangeCallback);
-        rtcSetGatheringStateChangeCallback(peer->pc, gatheringStateCallback);
-
-        // Since this is the offere, we will create a datachannel
-        peer->dc = rtcCreateDataChannel(peer->pc, "test");
-        rtcSetOpenCallback(peer->dc, openCallback);
-        rtcSetClosedCallback(peer->dc, closedCallback);
-        rtcSetMessageCallback(peer->dc, messageCallback);
-
-	    sleep(1);
-
-	    bool exit = false;
-        while (!exit) {
-
-                printf("\n");
-                printf("***************************************************************************************\n");
-                printf("* 0: Exit /"
-                       " 1: Enter remote description /"
-                       " 2: Enter remote candidate /"
-                       " 3: Send message /"
-                       " 4: Print Connection Info *\n"
-                       "[Command]: ");
-
-                int command = -1;
-                int c;
-
-		        if (!scanf("%d", &command)) {
-			        break;
-		        }
-
-		        while ((c = getchar()) != '\n' && c != EOF) {
-		        }
-		        fflush(stdin);
-
-                switch (command) {
-                case 0: {
-                        exit = true;
-                        break;
-                }
-                case 1: {
-                        // Parse Description
-                        printf("[Description]: ");
-
-
-                        char *line = NULL;
-                        size_t len = 0;
-                        size_t read = 0;
-                        char *sdp = (char*) malloc(sizeof(char));
-                        while ((read = getline(&line, &len, stdin)) != -1 && !all_space(line)) {
-                                sdp = (char*) realloc (sdp,(strlen(sdp)+1) +strlen(line)+1);
-                                strcat(sdp, line);
-
-                        }
-                        printf("%s\n",sdp);
-                        rtcSetRemoteDescription(peer->pc, sdp, "answer");
-                        free(sdp);
-                        free(line);
-                        break;
-
-                }
-                case 2: {
-                        // Parse Candidate
-                        printf("[Candidate]: ");
-                        char* candidate = NULL;
-                        size_t candidate_size = 0;
-                        if(getline(&candidate, &candidate_size, stdin)) {
-                                rtcAddRemoteCandidate(peer->pc, candidate, "0");
-                                free(candidate);
-
-                        }else {
-                                printf("Error reading line\n");
-                                break;
-                        }
-
-
-                        break;
-                }
-                case 3: {
-                        // Send Message
-                        if(!peer->connected) {
-                                printf("** Channel is not Open **");
-                                break;
-                        }
-                        printf("[Message]: ");
-                        char* message = NULL;
-                        size_t message_size = 0;
-                        if(getline(&message, &message_size, stdin)) {
-                                rtcSendMessage(peer->dc, message, -1);
-                                free(message);
-                        }else {
-                                printf("Error reading line\n");
-                                break;
-                        }
-
-                        break;
-                }
-                case 4: {
-                        // Connection Info
-                        if(!peer->connected) {
-                                printf("** Channel is not Open **");
-                                break;
-                        }
-                        char buffer[256];
-                        if (rtcGetLocalAddress(peer->pc, buffer, 256) >= 0)
-                                printf("Local address 1:  %s\n", buffer);
-                        if (rtcGetRemoteAddress(peer->pc, buffer, 256) >= 0)
-                                printf("Remote address 1: %s\n", buffer);
-
-                        else
-                                printf("Could not get Candidate Pair Info\n");
-                        break;
-                }
-                default: {
-                        printf("** Invalid Command **");
-                        break;
-                }
-                }
-        }
-
-        deletePeer(peer);
-        return 0;
-}
+	}
+	memset(peer, 0, sizeof(Peer));
+
+	printf("Peer created\n");
+
+	// Create peer connection
+	peer->pc = rtcCreatePeerConnection(&config);
+	rtcSetUserPointer(peer->pc, peer);
+	rtcSetLocalDescriptionCallback(peer->pc, descriptionCallback);
+	rtcSetLocalCandidateCallback(peer->pc, candidateCallback);
+	rtcSetStateChangeCallback(peer->pc, stateChangeCallback);
+	rtcSetGatheringStateChangeCallback(peer->pc, gatheringStateCallback);
+
+	// Since we are the offerer, we will create a datachannel
+	peer->dc = rtcCreateDataChannel(peer->pc, "test");
+	rtcSetOpenCallback(peer->dc, openCallback);
+	rtcSetClosedCallback(peer->dc, closedCallback);
+	rtcSetMessageCallback(peer->dc, messageCallback);
+
+	sleep(1);
+
+	bool exit = false;
+	while (!exit) {
+
+		printf("\n");
+		printf("***********************************************************************************"
+		       "****\n");
+		printf("* 0: Exit /"
+		       " 1: Enter remote description /"
+		       " 2: Enter remote candidate /"
+		       " 3: Send message /"
+		       " 4: Print Connection Info *\n"
+		       "[Command]: ");
+
+		int command = -1;
+		int c;
+
+		if (!scanf("%d", &command)) {
+			break;
+		}
+
+		while ((c = getchar()) != '\n' && c != EOF) {
+		}
+		fflush(stdin);
 
-static void descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
-        // Peer *peer = (Peer *)ptr;
-        printf("Description %s:\n%s\n", "offerer", sdp);
+		switch (command) {
+		case 0: {
+			exit = true;
+			break;
+		}
+		case 1: {
+			// Parse Description
+			printf("[Description]: ");
+
+			char *line = NULL;
+			size_t len = 0;
+			size_t read = 0;
+			char *sdp = (char *)malloc(sizeof(char));
+			while ((read = getline(&line, &len, stdin)) != -1 && !all_space(line)) {
+				sdp = (char *)realloc(sdp, (strlen(sdp) + 1) + strlen(line) + 1);
+				strcat(sdp, line);
+			}
+			printf("%s\n", sdp);
+			rtcSetRemoteDescription(peer->pc, sdp, "answer");
+			free(sdp);
+			free(line);
+			break;
+		}
+		case 2: {
+			// Parse Candidate
+			printf("[Candidate]: ");
+			char *candidate = NULL;
+			size_t candidate_size = 0;
+			if (getline(&candidate, &candidate_size, stdin)) {
+				rtcAddRemoteCandidate(peer->pc, candidate, "0");
+				free(candidate);
+
+			} else {
+				printf("Error reading line\n");
+				break;
+			}
+
+			break;
+		}
+		case 3: {
+			// Send Message
+			if (!peer->connected) {
+				printf("** Channel is not Open **");
+				break;
+			}
+			printf("[Message]: ");
+			char *message = NULL;
+			size_t message_size = 0;
+			if (getline(&message, &message_size, stdin)) {
+				rtcSendMessage(peer->dc, message, -1);
+				free(message);
+			} else {
+				printf("Error reading line\n");
+				break;
+			}
+
+			break;
+		}
+		case 4: {
+			// Connection Info
+			if (!peer->connected) {
+				printf("** Channel is not Open **");
+				break;
+			}
+			char buffer[256];
+			if (rtcGetLocalAddress(peer->pc, buffer, 256) >= 0)
+				printf("Local address 1:  %s\n", buffer);
+			if (rtcGetRemoteAddress(peer->pc, buffer, 256) >= 0)
+				printf("Remote address 1: %s\n", buffer);
+
+			else
+				printf("Could not get Candidate Pair Info\n");
+			break;
+		}
+		default: {
+			printf("** Invalid Command **");
+			break;
+		}
+		}
+	}
+
+	deletePeer(peer);
+	return 0;
 }
 
-static void candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
-        // Peer *peer = (Peer *)ptr;
-        printf("Candidate %s: %s\n", "offerer", cand);
+static void RTC_API descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
+	printf("Description %s:\n%s\n", "offerer", sdp);
+}
 
+static void RTC_API candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
+	printf("Candidate %s: %s\n", "offerer", cand);
 }
 
-static void stateChangeCallback(int pc, rtcState state, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->state = state;
-        printf("State %s: %s\n", "offerer", state_print(state));
+static void RTC_API stateChangeCallback(int pc, rtcState state, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->state = state;
+	printf("State %s: %s\n", "offerer", state_print(state));
 }
 
-static void gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->gatheringState = state;
-        printf("Gathering state %s: %s\n", "offerer", rtcGatheringState_print(state));
+static void RTC_API gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->gatheringState = state;
+	printf("Gathering state %s: %s\n", "offerer", rtcGatheringState_print(state));
 }
 
-static void openCallback(int id, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->connected = true;
-        char buffer[256];
-        if (rtcGetDataChannelLabel(peer->dc, buffer, 256) >= 0)
-                printf("DataChannel %s: Received with label \"%s\"\n","offerer", buffer);
+static void RTC_API openCallback(int id, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->connected = true;
+	char buffer[256];
+	if (rtcGetDataChannelLabel(peer->dc, buffer, 256) >= 0)
+		printf("DataChannel %s: Received with label \"%s\"\n", "offerer", buffer);
 }
 
-static void closedCallback(int id, void *ptr) {
-        Peer *peer = (Peer *)ptr;
-        peer->connected = false;
+static void RTC_API closedCallback(int id, void *ptr) {
+	Peer *peer = (Peer *)ptr;
+	peer->connected = false;
 }
 
-static void messageCallback(int id, const char *message, int size, void *ptr) {
-        // Peer *peer = (Peer *)ptr;
-        if (size < 0) { // negative size indicates a null-terminated string
-                printf("Message %s: %s\n", "offerer", message);
-        } else {
-                printf("Message %s: [binary of size %d]\n", "offerer", size);
-        }
+static void RTC_API messageCallback(int id, const char *message, int size, void *ptr) {
+	if (size < 0) { // negative size indicates a null-terminated string
+		printf("Message %s: %s\n", "offerer", message);
+	} else {
+		printf("Message %s: [binary of size %d]\n", "offerer", size);
+	}
 }
 
 static void deletePeer(Peer *peer) {
-        if (peer) {
-                if (peer->dc)
-                        rtcDeleteDataChannel(peer->dc);
-                if (peer->pc)
-                        rtcDeletePeerConnection(peer->pc);
-                free(peer);
-        }
+	if (peer) {
+		if (peer->dc)
+			rtcDeleteDataChannel(peer->dc);
+		if (peer->pc)
+			rtcDeletePeerConnection(peer->pc);
+		free(peer);
+	}
 }
 
 char *state_print(rtcState state) {

+ 4 - 4
include/rtc/rtc.h

@@ -25,15 +25,15 @@ extern "C" {
 
 #ifdef _WIN32
 #define RTC_EXPORT __declspec(dllexport)
-#else
-#define RTC_EXPORT
-#endif
-
 #ifdef CAPI_STDCALL
 #define RTC_API __stdcall
 #else
 #define RTC_API
 #endif
+#else // not WIN32
+#define RTC_EXPORT
+#define RTC_API
+#endif
 
 #ifndef RTC_ENABLE_WEBSOCKET
 #define RTC_ENABLE_WEBSOCKET 1

+ 8 - 8
test/capi_connectivity.cpp

@@ -42,33 +42,33 @@ typedef struct {
 static Peer *peer1 = NULL;
 static Peer *peer2 = NULL;
 
-static void descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
+static void RTC_API descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	printf("Description %d:\n%s\n", peer == peer1 ? 1 : 2, sdp);
 	Peer *other = peer == peer1 ? peer2 : peer1;
 	rtcSetRemoteDescription(other->pc, sdp, type);
 }
 
-static void candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
+static void RTC_API candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	printf("Candidate %d: %s\n", peer == peer1 ? 1 : 2, cand);
 	Peer *other = peer == peer1 ? peer2 : peer1;
 	rtcAddRemoteCandidate(other->pc, cand, mid);
 }
 
-static void stateChangeCallback(int pc, rtcState state, void *ptr) {
+static void RTC_API stateChangeCallback(int pc, rtcState state, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->state = state;
 	printf("State %d: %d\n", peer == peer1 ? 1 : 2, (int)state);
 }
 
-static void gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
+static void RTC_API gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->gatheringState = state;
 	printf("Gathering state %d: %d\n", peer == peer1 ? 1 : 2, (int)state);
 }
 
-static void openCallback(int id, void *ptr) {
+static void RTC_API openCallback(int id, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->connected = true;
 	printf("DataChannel %d: Open\n", peer == peer1 ? 1 : 2);
@@ -77,12 +77,12 @@ static void openCallback(int id, void *ptr) {
 	rtcSendMessage(peer->dc, message, -1); // negative size indicates a null-terminated string
 }
 
-static void closedCallback(int id, void *ptr) {
+static void RTC_API closedCallback(int id, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->connected = false;
 }
 
-static void messageCallback(int id, const char *message, int size, void *ptr) {
+static void RTC_API messageCallback(int id, const char *message, int size, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	if (size < 0) { // negative size indicates a null-terminated string
 		printf("Message %d: %s\n", peer == peer1 ? 1 : 2, message);
@@ -91,7 +91,7 @@ static void messageCallback(int id, const char *message, int size, void *ptr) {
 	}
 }
 
-static void dataChannelCallback(int pc, int dc, void *ptr) {
+static void RTC_API dataChannelCallback(int pc, int dc, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->dc = dc;
 	peer->connected = true;

+ 7 - 7
test/capi_track.cpp

@@ -43,44 +43,44 @@ static Peer *peer2 = NULL;
 static const char *mediaDescription = "video 9 UDP/TLS/RTP/SAVPF\r\n"
                                       "a=mid:video\r\n";
 
-static void descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
+static void RTC_API descriptionCallback(int pc, const char *sdp, const char *type, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	printf("Description %d:\n%s\n", peer == peer1 ? 1 : 2, sdp);
 	Peer *other = peer == peer1 ? peer2 : peer1;
 	rtcSetRemoteDescription(other->pc, sdp, type);
 }
 
-static void candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
+static void RTC_API candidateCallback(int pc, const char *cand, const char *mid, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	printf("Candidate %d: %s\n", peer == peer1 ? 1 : 2, cand);
 	Peer *other = peer == peer1 ? peer2 : peer1;
 	rtcAddRemoteCandidate(other->pc, cand, mid);
 }
 
-static void stateChangeCallback(int pc, rtcState state, void *ptr) {
+static void RTC_API stateChangeCallback(int pc, rtcState state, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->state = state;
 	printf("State %d: %d\n", peer == peer1 ? 1 : 2, (int)state);
 }
 
-static void gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
+static void RTC_API gatheringStateCallback(int pc, rtcGatheringState state, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->gatheringState = state;
 	printf("Gathering state %d: %d\n", peer == peer1 ? 1 : 2, (int)state);
 }
 
-static void openCallback(int id, void *ptr) {
+static void RTC_API openCallback(int id, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->connected = true;
 	printf("Track %d: Open\n", peer == peer1 ? 1 : 2);
 }
 
-static void closedCallback(int id, void *ptr) {
+static void RTC_API closedCallback(int id, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->connected = false;
 }
 
-static void trackCallback(int pc, int tr, void *ptr) {
+static void RTC_API trackCallback(int pc, int tr, void *ptr) {
 	Peer *peer = (Peer *)ptr;
 	peer->tr = tr;
 	peer->connected = true;