//	logging.cpp
//
//	Place this file in the same direcory as stdsoap2.h
//	Requires soapdefs.h (compile stdsoap2.cpp with -DWITH_SOAPDEFS_H
//	and -DDEBUG_CALLBACKS)
//
//	Runtime/Customer logging by Mike Helmick
//	Copyright (c) 2002 - Mike Helmick. Convergys IMG. All Rights Reserved.
//	This contributed code is covered under the MPL 1.1 license

#include "stdsoap2.h"	// includes "soapdefs.h" when compiled with -DWITH_SOAPDEFS_H

void soap_recv_callback(struct soap*, const char*, size_t len);
void soap_sent_callback(struct soap*, const char*, size_t len);
void soap_test_callback(struct soap*, const char*, size_t len);

void
soap_dispatch_callback(struct soap *soap, int idx, const char *msg, size_t len)
{	if (!soap->user)
	{	// you can set stuff up here, streams etc.
		// soap->user is used to pass user-defined data
		// soap->user is never set nor cleared by gSOAP
		soap->user = (void*)&cout;
		// don't forget to clean up the streams in the main code
		// (before discarding the soap runtime environment)
	}
	switch (idx)
	{	case SOAP_INDEX_RECV:
			soap_recv_callback(soap, msg, len);
			break;
	 	case SOAP_INDEX_SENT:
			soap_sent_callback(soap, msg, len);
			break;
	 	case SOAP_INDEX_TEST:
			soap_test_callback(soap, msg, len);
			break;
	}
}

// Note: 'msg' is not 0-terminated!
void
soap_recv_callback(struct soap *soap, const char *msg, size_t len)
{ ostream& os = *(ostream*)soap->user;
  os << endl
	<< "Received:" << endl
	<< "----------------------------------------" << endl;
  os.write(msg, len);
  os << "----------------------------------------" << endl;
}

void
soap_sent_callback(struct soap *soap, const char *msg, size_t len)
{ ostream& os = *(ostream*)soap->user;
  os << endl
	<< "Sent:" << endl
	<< "----------------------------------------" << endl;
  os.write(msg, len);
  os << "----------------------------------------" << endl;
}

void
soap_test_callback(struct soap *soap, const char *msg, size_t len)
{ (*(ostream*)soap->user << "Trace: ").write(msg, len);
}
