
===================
= Developer notes =
===================

Q: What are the loose requirements?

A:

1. Since docs will be way larger than most MTU's (1500, test doc is 4KB). TCP is probably way to go. Additionally, we won't have to build in challenges.
2. Build app as OSS project (no 3rd party libs if possible).
3. Read config from murmur config.
4. Must work on Linux (include Makefile).
5. Config override via command line.
6. Reuse Murmur channel viewer protocol.
7. Compatiblity with versions of Murmur starting with 1.2.0 and onward.

-------------

Q: Can we statically compile ICE?

A: ICE was not designed to be statically compiled, although the Mumble devs were able to build it statically. It would be easier to reverse engineer the
network traffic.


-------------

How to generate Murmur.cpp/Murmur.h:

This was done on Windows. I experienced some pathing issues with slice2cpp and the ICE SDK, therefore I copied the required binaries to a new folder and compiled. The contents of this folder are included in "slice.zip".
The command to compile the slice is:

"slice2cpp.exe -I. --checksum  Murmur.ice"


-------------

Murmur slice documentation:

http://mumble.sourceforge.net/slice
http://mumble.sourceforge.net/slice/Murmur.html


-------------
Q: What happens if the Mumble team changes the "Murmur.ice" format?

A: 	For functions:

		An "OperationNotExistException" should be thrown.
		According to ICE spec ( http://doc.zeroc.com/display/Ice/Run-Time+Exceptions#Run-TimeExceptions-{{OperationNotExistException}} ):
		"... Client and server have been built with Slice definitions for an interface that disagree with each other, that is, the client was built with an interface definition for the object that indicates that an operation exists, but the server was built with a different version of the interface definition in which the operation is absent."

	For data structures:
	
		With the "ICE" handler, I tested 1.2.3 slice against 1.2.2 Murmur server. They added two variables to the User data structure between 1.2.2 and 1.2.3. 
		This throws an "Ice::UnmarshalOutOfBoundsException". I edited the 1.2.3 generated C++ source to omit reading/writing these variables and it worked fine.
		This doc explains more: http://doc.zeroc.com/pages/viewpage.action?pageId=3900807
		
		NOTE: It seems that the "Dynamic Invocation and Dispatch in C++" is the proper way to account for this.
		
		----
				
		With the "no-ICE" handler, the parser will fail. I added a version check to do version-specific tests.


-------------
