public void Generate(Parser parser, string destinationFolder)
{
const string connectionString = "Database=hmailserver_webpage;Data Source=hmailserver.com;User Id=user;Password=password;CharSet=utf8";
using (MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connectionString))
{
conn.Open();
foreach (APIInterface apiInterface in parser.Interfaces)
{
// do some pre-sorting...
IEnumerable<APIMethod> methods = apiInterface.Methods.OrderBy(method => method.Name);
IEnumerable<APIProperty> properties = apiInterface.Properties.OrderBy(prop => prop.Name);
string fileName = Path.Combine(destinationFolder, "com_object_" + apiInterface.Name + ".html");
fileName = fileName.ToLower();
string outputCode = "";
outputCode = "<h3>Description</h3>";
outputCode += apiInterface.HelpString + "<br/>";
if (methods.Count() > 0)
{
outputCode += "<h3>Methods</h3>";
foreach (APIMethod method in methods)
{
string outputLine = string.Format("<div class=\"api_method_name\">{0}(", method.Name);
string parameters = "";
foreach (APIParameter parameter in method.Parameters)
{
if (!parameter.Input)
continue;
string parameterItem = string.Format("{0} {1}", CreateLinkToType(parser, FriendlynizeType(parameter.Type)), parameter.Name);
if (parameters.Length > 0)
parameters += ", ";
parameters += parameterItem;
}
outputLine += parameters;
outputLine += ")";
outputLine += "</div>";
outputCode += outputLine;
if (method.HelpString.Length > 0)
{
outputLine = string.Format("<br/><div class=\"api_description\">{0}</div>", method.HelpString);
outputCode += outputLine;
}
outputCode += "<br/>";
}
}
if (properties.Count() > 0)
{
outputCode += "<h3>Properties</h3>";
List<string> printedProperties = new List<string>();
foreach (APIProperty property in properties)
{
string outputLine = string.Format("<div class=\"api_method_name\">");
if (printedProperties.Contains(property.Name))
continue;
printedProperties.Add(property.Name);
foreach (APIParameter parameter in property.Parameters)
{
if (parameter.Input && property.Parameters.Count > 1)
continue;
outputLine += CreateLinkToType(parser, FriendlynizeType(parameter.Type)) + " ";
}
outputLine += string.Format("{0}", property.Name);
string parameters = "";
if (property.Parameters.Count > 1)
{
for (int i = 0; i < property.Parameters.Count; i++ )
{
APIParameter parameter = property.Parameters[i];
if (!parameter.Input)
continue;
string parameterItem = string.Format("{0} {1}", CreateLinkToType(parser, FriendlynizeType(parameter.Type)), parameter.Name);
if (parameters.Length > 0)
parameters += ", ";
parameters += parameterItem;
}
if (parameters.Length > 0)
{
outputLine += "(";
outputLine += parameters;
outputLine += ")";
}
}
outputLine += "</div>";
outputCode += outputLine;
if (property.HelpString.Length > 0)
{
outputLine = string.Format("<br/><div class=\"api_description\">{0}<br/>", property.HelpString);
if (!property.HasSet)
{
// check if there's a set-property with same name.
IEnumerable<APIProperty> setProperties = properties.Where(prop => prop.Name == property.Name && prop.HasSet == true);
if (setProperties.Count() == 0)
outputLine += " <i>(read-only)</i>";
}
outputLine += "</div>";
outputCode += outputLine;
}
outputCode += "<br/>";
}
}
File.WriteAllText(fileName, outputCode);
UploadDocument(conn, apiInterface, outputCode);
}
// remove old documents.
string sql = "select documentid, documentname from hm_documents where documentname like 'com\\_object\\_%'";
MySqlCommand selectCommand = new MySqlCommand(sql, conn);
List<int> documentsToRemove = new List<int>();
using (MySqlDataReader reader = selectCommand.ExecuteReader())
{
while (reader.Read())
{
int documentID = Convert.ToInt32(reader["documentid"]);
string documentName = Convert.ToString(reader["documentname"]);
IEnumerable<APIInterface> interfaces = parser.Interfaces.Where(apiInterface => "com_object_" + apiInterface.Name.ToLower() == documentName);
if (interfaces.Count() == 0)
{
documentsToRemove.Add(documentID);
}
}
reader.Close();
}
foreach (int documentToRemove in documentsToRemove)
{
sql = string.Format("delete from hm_documents where documentid = {0}", documentToRemove);
MySqlCommand deleteCommand = new MySqlCommand(sql, conn);
deleteCommand.ExecuteNonQuery();
}
}
}