private void InternalPrint(bool automaticPrint)
{
var data = this.GetData(this.config.PrintUrl);
var printTemplateViewModel = JsonConvert.DeserializeObject<PrintTemplateViewModel>(data);
if (printTemplateViewModel?.EinsatzData == null)
{
return;
}
PrintQueue printQueue = null;
try
{
printQueue = LocalPrintServer.GetDefaultPrintQueue();
if (printQueue == null)
{
// No printer exist, return null PrintTicket
// ReSharper disable once InconsistentlySynchronizedField
Logger.Info("No printer exists");
return;
}
// Get default PrintTicket from printer
var printTicket = printQueue.DefaultPrintTicket;
printTicket.CopyCount = automaticPrint
? this.config.NumberOfPagesOnEmergency
: this.config.NumberOfPagesPerClick;
var printCapabilites = printQueue.GetPrintCapabilities();
// Modify PrintTicket
if (printCapabilites.PageMediaSizeCapability.Any(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4)))
{
printTicket.PageMediaSize = printCapabilites.PageMediaSizeCapability.First(x => x.PageMediaSizeName.Equals(PageMediaSizeName.ISOA4));
}
if (printCapabilites.PageOrientationCapability.Contains(PageOrientation.Portrait))
{
printTicket.PageOrientation = PageOrientation.Portrait;
}
if (printCapabilites.PageBorderlessCapability.Contains(PageBorderless.Borderless))
{
printTicket.PageBorderless = PageBorderless.Borderless;
}
if (printCapabilites.CollationCapability.Contains(Collation.Collated))
{
printTicket.Collation = Collation.Collated;
}
var doc = new FixedDocument();
foreach (var emergencyData in printTemplateViewModel.EinsatzData)
{
var item = emergencyData;
lock (this.printedMissionsLockObject)
{
if (automaticPrint && this.printedMissions.Any(x => x.EinsatzID.Equals(item.EinsatzID)))
{
continue;
}
var tempItem = this.printedMissions.FirstOrDefault(x => x.EinsatzID.Equals(item.EinsatzID));
if (tempItem != null
&& tempItem.PublicInstancePropertiesEqual(
item, "Dispositionen", "MapUrl", "MapImage", "Area"))
{
tempItem.Dispositionen = item.Dispositionen; // Always update dispositions because of missing deep value comparison
item = tempItem;
Logger.DebugFormat(
"Using cached version of emergency ID '{0}'",
item.EinsatzID);
}
else
{
if (tempItem != null)
{
Logger.DebugFormat(
"Removing emergency ID '{0}' from cache",
tempItem.EinsatzID);
this.printedMissions.Remove(tempItem);
}
Logger.DebugFormat("Adding emergency ID '{0}' to cache", item.EinsatzID);
this.printedMissions.Add(item);
}
}
// ReSharper disable once InconsistentlySynchronizedField
Logger.DebugFormat(
"Printing '{0}', # of copies={1}",
item.EinsatzID,
printTicket.CopyCount);
if (string.IsNullOrWhiteSpace(item.MapUrl))
{
// Google Static Maps Developer Guide: https://developers.google.com/maps/documentation/static-maps/intro
// #if DEBUG
// var greyMap = new StaticMapRequest(new List<Marker>(), new ImageSize(640, 640));
// greyMap.Style = new List<MapStyle>
// {
// new MapStyle
// {
// MapFeature = MapFeature.Landscape,
// Saturation = -100,
// Lightness = 65
// },
// new MapStyle
// {
// MapFeature = MapFeature.Poi,
// Saturation = -100,
// Lightness = 51,
// Visibility = MapVisibility.Simplified
// },
// new MapStyle
// {
// MapFeature = MapFeature.RoadHighway,
// Saturation = -100,
// Visibility = MapVisibility.Simplified
// },
// new MapStyle
// {
// MapFeature = MapFeature.RoadArterial,
// Saturation = -100,
// Lightness = 30
// },
// new MapStyle
// {
// MapFeature = MapFeature.RoadLocal,
// Saturation = -100,
// Lightness = 40
// },
// new MapStyle
// {
// MapFeature = MapFeature.Transit,
// Saturation = -100,
// Visibility = MapVisibility.Simplified
// },
// new MapStyle
// {
// MapFeature =
// MapFeature.AdministrativeProvince,
// Visibility = MapVisibility.Off
// },
// new MapStyle
// {
// MapFeature = MapFeature.Water,
// MapElement = MapElement.Labels,
// Saturation = -100,
// Lightness = -25
// },
// new MapStyle
// {
// MapFeature = MapFeature.Water,
// MapElement = MapElement.Geometry,
// Saturation = -97,
// Lightness = -25,
// HUE = Color.FromArgb(255, 255, 0)
// }
// };
// var engine = new StaticMapsEngine();
// var url = engine.GenerateStaticMapUrl(greyMap);
// #endif
var mapData =
this.GetData(
$"https://secure.florian10.info/ows/infoscreen/geo/staticmap.ashx?address={item.Strasse}{(string.IsNullOrWhiteSpace(item.Nummer1) ? string.Empty : "%20" + item.Nummer1)},%20{item.Plz}%20{item.Ort}");
if (!string.IsNullOrWhiteSpace(mapData))
{
var mapUrl =
mapData.Remove(mapData.Length - 2, 2)
.Remove(0, 8)
.Replace("&size=800x400&", "&size=640x640&scale=2&")
.Replace("2.png", ".png")
.Replace("&markers=icon:http://", "&markers=scale:2|icon:http://");
item.MapUrl = $"{mapUrl}&maptype={this.config.MapType.ToString().ToLowerInvariant()}";
var latLng =
mapData.Split('&')
.First(x => x.StartsWith("center="))
.Split(',')
.Select(x => x.Replace("center=", string.Empty))
.ToList();
if (latLng.Count >= 2)
{
var areaJson =
this.GetData(
$"https://secure.florian10.info/ows/infoscreen/geo/umkreis.ashx?lat={latLng[0]}&lng={latLng[1]}");
item.Area = JsonConvert.DeserializeObject<Area>(areaJson);
item.Area.PointLimit = this.config.MaxHydrants;
}
}
}
var fixedPage = new FixedPage();
var template = new PrintTemplate { DataContext = item };
if (printCapabilites.PageImageableArea != null)
{
template.Width = printCapabilites.PageImageableArea.ExtentWidth;
template.Height = printCapabilites.PageImageableArea.ExtentHeight;
FixedPage.SetLeft(template, printCapabilites.PageImageableArea.OriginWidth);
FixedPage.SetTop(template, printCapabilites.PageImageableArea.OriginHeight);
}
fixedPage.Children.Add(template);
var pageContent = new PageContent();
((IAddChild)pageContent).AddChild(fixedPage);
doc.Pages.Add(pageContent);
}
if (doc.Pages.Any())
{
// ReSharper disable once InconsistentlySynchronizedField
Logger.Debug("Printing now");
PrintQueue.CreateXpsDocumentWriter(printQueue).Write(doc, printTicket);
}
}
finally
{
printQueue?.Dispose();
}
}