Andy's company develops solutions for "Industrial" handheld devices. To make deployment and updates easier, they each run a thin client so only the server is different from project to project. This client was written by a long-gone employee in the early nineties, and had barely changed since because it "just worked". Updating it was discouraged for fear of breaking backward-compatibility.

Andy's new project was the first chance he'd had to use it, so he asked a colleague if there was some code that could be used to interface with it. What Andy received was essentially a giant method which responded to the client by cycling through a switch-statement to decide what to paint next based on the current state of the client. Andy took the initiative to create a library for making servers for these things a bit less spaghetti-like, and to encourage this new-fangled concept of code-reuse.

Another long-gone employee had written a fairly usable set of methods for interacting with it. A lot of these methods had a color parameter of type String, which was in turn sent directly to the client as a part of the command sequence. To get a hint of what this String should contain, Andy looked up some calling code and found that there was also a method which converted a standard .Net Color to a String the client would understand. Unfortunately, it looked like this:

private string translateColor(Color color) {
  if(color == System.Drawing.Color.Black) {
     return "&H0&";
  } else if(color == System.Drawing.Color.Lime) {
     return "&HFF00&";
  } else if(color == System.Drawing.Color.Red) {
     return "&HFF&";
  } else if(color == System.Drawing.Color.Yellow) {
     return "&HFFFF&";
  } else if(color == System.Drawing.Color.Orange) {
     return "&H80C0FF";
  } else if(color == System.Drawing.Color.Blue) {
     return "&HFF0000";
  } else if(color == System.Drawing.Color.LightGray) {
     return "&H808080";
  } else if(color == System.Drawing.Color.DarkGray) {
     return "&HC0C0C0";
  } else if(color == System.Drawing.Color.White) {
     return "16777215";
  } else {
     //Error - using white
     return "16777215";

Since Andy was a diligent engineer and wanted to do things properly, he thought that there must be a way to make this more clever, and spent a good hour trying to automatically convert generic Colors into what the accepted formats seemed to be. Unfortunately none of it was understood by the client. Combining the RGB values into one integer seemed promising, but it turned out to only work for white.

Annoyed, Andy spelunked through SVN for the client, found it and looked up the code which converts the String back:

Public Shared Function GetColor(ByVal strColor As String) As Color
   Select Case strColor
      Case "&H0&"
         Return Color.Black
      Case "0"
         Return Color.Black 'color
      Case "&HFF00&"
         Return Color.Lime
      Case "65280"
         Return Color.Lime
      Case "&HFF&"
         Return Color.Red
      Case "255"
         Return Color.Red
      Case "&H8000000F"
         Return Color.LightGray
      Case "&H808080"
         Return Color.LightGray
      Case "-2147483633"
         Return Color.LightGray
      Case "&H80000005"
         Return Color.White
      Case "16777215"
         Return Color.White
      Case "&HFF0000"
         Return Color.Blue
      Case "16711680"
         Return Color.Blue
      Case "&H80C0FF"
         Return Color.Orange
      Case "65535"
         Return Color.Orange 'bright yellow
      Case "&HC0C0C0"
         Return Color.DarkGray
      Case "&HFFFF&"
         Return Color.Yellow
      Case Else
         Return Color.Purple 'error
   End Select
End Function

Andy pondered all the places from which this was called, and decided to move on.

[Advertisement] BuildMaster allows you to create a self-service release management platform that allows different teams to manage their applications. Explore how!