public static objects GetObjects(string path)
{
var c = new objects();
try
{
lock (ThreadLock)
{
using (var fs = new FileStream(path, FileMode.Open))
{
var s = new XmlSerializer(typeof (objects));
using (TextReader reader = new StreamReader(fs))
{
fs.Position = 0;
c = (objects) s.Deserialize(reader);
}
}
}
}
catch (Exception ex)
{
Logger.LogExceptionToFile(ex);
switch (MessageBox.Show($"Error loading file ({ex.Message}) Try again?", "Error", MessageBoxButtons.YesNo))
{
case DialogResult.Yes:
return GetObjects(path);
}
}
if (c.cameras==null)
c.cameras = new objectsCamera[] {};
bool addActions = c.actions == null;
if (addActions)
c.actions = new objectsActions { entries = new objectsActionsEntry[] { } };
bool addSchedule = c.schedule == null;
if (addSchedule)
c.schedule = new objectsSchedule {entries = new objectsScheduleEntry[] {}};
if (c.cameras.Select(oc => oc.settings.desktopresizewidth).Any(rw => rw == 0))
{
throw new Exception("err_old_config");
}
if (c.microphones==null)
c.microphones = new objectsMicrophone[] {};
if (c.floorplans == null)
c.floorplans = new objectsFloorplan[] {};
if (c.remotecommands == null)
c.remotecommands = new objectsCommand[] {};
if (c.remotecommands.Length == 0)
{
c.remotecommands = GenerateRemoteCommands();
}
bool bVlc = VlcHelper.VlcInstalled;
MaxOrderIndex = 0;
bool bAlertVlc = false;
int camid = 0;
string path2;
//load non clones first
c.cameras = c.cameras.ToList().OrderByDescending(p => p.settings.sourceindex != 10).ToArray();
c.microphones = c.microphones.ToList().OrderByDescending(p => p.settings.typeindex != 5).ToArray();
foreach (objectsCamera cam in c.cameras)
{
if (cam.id >= camid)
camid = cam.id + 1;
if (cam.settings.order == -1)
{
cam.settings.order = MaxOrderIndex;
MaxOrderIndex++;
}
path2 = Helper.GetMediaDirectory(cam.settings.directoryIndex) + "video\\" + cam.directory + "\\";
if (cam.settings.sourceindex == 5 && !bVlc)
{
bAlertVlc = true;
}
if (cam.settings.youtube == null)
{
cam.settings.youtube = new objectsCameraSettingsYoutube
{
category = Conf.YouTubeDefaultCategory,
tags = "iSpy, Motion Detection, Surveillance",
@public = true
};
}
if (cam.ptzschedule == null)
{
cam.ptzschedule = new objectsCameraPtzschedule
{
active = false,
entries = new objectsCameraPtzscheduleEntry[] {}
};
}
if (cam.settings.storagemanagement == null)
{
cam.settings.storagemanagement = new objectsCameraSettingsStoragemanagement
{
enabled = false,
maxage = 72,
maxsize = 1024
};
}
bool migrate = false;
if (cam.alertevents == null)
{
cam.alertevents = new objectsCameraAlertevents();
migrate = true;
}
if (cam.settings.cloudprovider==null)
cam.settings.cloudprovider = new objectsCameraSettingsCloudprovider();
if (cam.alertevents.entries == null)
cam.alertevents.entries = new objectsCameraAlerteventsEntry[] {};
if (migrate)
{
var l = new List<objectsCameraAlerteventsEntry>();
if (!string.IsNullOrEmpty(cam.alerts.executefile))
{
l.Add(new objectsCameraAlerteventsEntry
{
type = "Exe",
param1 = cam.alerts.executefile,
param2 = cam.alerts.arguments
});
}
if (cam.notifications.sendemail)
{
l.Add(new objectsCameraAlerteventsEntry
{
type = "E",
param1 = cam.settings.emailaddress,
param2 = "True"
});
}
if (cam.notifications.sendsms)
{
l.Add(new objectsCameraAlerteventsEntry {type = "SMS", param1 = cam.settings.smsnumber});
}
if (cam.alerts.maximise)
{
l.Add(new objectsCameraAlerteventsEntry {type = "M"});
}
if (!string.IsNullOrEmpty(cam.alerts.playsound))
{
l.Add(new objectsCameraAlerteventsEntry {type = "S", param1 = cam.alerts.playsound});
}
string[] alertOptions = cam.alerts.alertoptions.Split(','); //beep,restore
if (Convert.ToBoolean(alertOptions[0]))
l.Add(new objectsCameraAlerteventsEntry {type = "B"});
if (Convert.ToBoolean(alertOptions[1]))
l.Add(new objectsCameraAlerteventsEntry {type = "SW"});
if (cam.notifications.sendtwitter)
{
l.Add(new objectsCameraAlerteventsEntry {type = "TM"});
}
if (!string.IsNullOrEmpty(cam.alerts.trigger))
{
l.Add(new objectsCameraAlerteventsEntry {type = "TA", param1 = cam.alerts.trigger});
}
cam.alertevents.entries = l.ToArray();
}
if (addActions)
{
var l = c.actions.entries.ToList();
l.AddRange(cam.alertevents.entries.Select(a => new objectsActionsEntry
{
mode = "alert",
objectid = cam.id,
objecttypeid = 2,
type = a.type,
param1 = a.param1,
param2 = a.param2,
param3 = a.param3,
param4 = a.param4,
ident = Guid.NewGuid().ToString()
}));
if (!string.IsNullOrEmpty(cam.settings.emailondisconnect))
{
l.Add(new objectsActionsEntry
{
mode = "disconnect",
objectid = cam.id,
objecttypeid = 2,
type = "E",
param1 = cam.settings.emailondisconnect,
param2 = "False",
ident = Guid.NewGuid().ToString()
});
}
c.actions.entries = l.ToArray();
}
cam.newrecordingcount = 0;
if (cam.settings.maxframerate == 0)
cam.settings.maxframerate = 10;
if (cam.settings.maxframeraterecord == 0)
cam.settings.maxframeraterecord = 10;
if (cam.settings.timestampfontsize == 0)
cam.settings.timestampfontsize = 10;
if (cam.recorder.timelapsesave == 0)
cam.recorder.timelapsesave = 60;
if (cam.x < 0)
cam.x = 0;
if (cam.y < 0)
cam.y = 0;
if (cam.detector.minwidth == 0)
{
cam.detector.minwidth = 20;
cam.detector.minheight = 20;
cam.detector.highlight = true;
cam.settings.reconnectinterval = 0;
}
if (cam.settings.accessgroups == null)
cam.settings.accessgroups = "";
if (cam.settings.ptztimetohome == 0)
cam.settings.ptztimetohome = 100;
if (cam.settings.ptzautohomedelay == 0)
cam.settings.ptzautohomedelay = 30;
if (cam.settings.ptzurlbase == null)
cam.settings.ptzurlbase = "";
if (cam.settings.audioport <= 0)
cam.settings.audioport = 80;
if (cam.ftp.intervalnew < 0)
cam.ftp.intervalnew = cam.ftp.interval;
if (cam.ftp.server.Length>10)
{
var ftp = Conf.FTPServers.FirstOrDefault(p => p.name == cam.ftp.server && p.username==cam.ftp.username);
if (ftp == null)
{
ftp = new configurationServer
{
ident = Guid.NewGuid().ToString(),
name=cam.ftp.server,
password = cam.ftp.password,
port = cam.ftp.port,
rename = cam.ftp.rename,
server = cam.ftp.server,
usepassive = cam.ftp.usepassive,
username = cam.ftp.username
};
var l = Conf.FTPServers.ToList();
l.Add(ftp);
Conf.FTPServers = l.ToArray();
cam.ftp.ident = ftp.ident;
cam.ftp.server = "";
}
}
if (Conf.MediaDirectories.FirstOrDefault(p => p.ID == cam.settings.directoryIndex) == null)
cam.settings.directoryIndex = Conf.MediaDirectories.First().ID;
if (string.IsNullOrEmpty(cam.settings.emailondisconnect))
{
if (cam.settings.notifyondisconnect)
{
cam.settings.emailondisconnect = cam.settings.emailaddress;
}
}
cam.detector.type = cam.detector.type.Replace("Modelling", "Modeling");//fix typo
if (cam.recorder.quality == 0)
cam.recorder.quality = 8;
if (cam.recorder.timelapseframerate == 0)
cam.recorder.timelapseframerate = 5;
if (cam.detector.movementintervalnew < 0)
cam.detector.movementintervalnew = cam.detector.movementinterval;
if (cam.detector.nomovementintervalnew < 0)
cam.detector.nomovementintervalnew = cam.detector.nomovementinterval;
if (cam.directory == null)
throw new Exception("err_old_config");
if (string.IsNullOrEmpty(cam.settings.ptzpelcoconfig))
cam.settings.ptzpelcoconfig = "COM1|9600|8|One|Odd|1";
if (cam.savelocal == null)
{
cam.savelocal = new objectsCameraSavelocal
{
counter = cam.ftp.counter,
countermax = cam.ftp.countermax,
mode = cam.ftp.mode,
enabled = cam.ftp.savelocal,
filename = cam.ftp.localfilename,
intervalnew = cam.ftp.intervalnew,
minimumdelay = cam.ftp.minimumdelay,
quality = cam.ftp.quality,
text = cam.ftp.text
};
}
if (cam.alerts.processmode == null)
cam.alerts.processmode = "continuous";
if (cam.alerts.pluginconfig == null)
cam.alerts.pluginconfig = "";
if (cam.ftp.quality == 0)
cam.ftp.quality = 75;
if (cam.ftp.countermax == 0)
cam.ftp.countermax = 20;
if (cam.settings.audiousername == null)
{
cam.settings.audiousername = "";
cam.settings.audiopassword = "";
}
if (string.IsNullOrEmpty(cam.settings.timestampforecolor) || cam.settings.timestampforecolor == "0")
{
cam.settings.timestampforecolor = "255,255,255";
}
if (string.IsNullOrEmpty(cam.settings.timestampbackcolor) || cam.settings.timestampbackcolor == "0")
{
cam.settings.timestampbackcolor = "70,70,70";
}
if (Math.Abs(cam.detector.minsensitivity - 0) < double.Epsilon)
{
cam.detector.maxsensitivity = 100;
//fix for old setting conversion
cam.detector.minsensitivity = 100 - cam.detector.sensitivity;
if (Math.Abs(cam.detector.minsensitivity - 100) < double.Epsilon)
{
cam.detector.minsensitivity = 20;
}
}
if (cam.detector.minsensitivity > cam.detector.maxsensitivity)
{
//reset
cam.detector.maxsensitivity = 100;
cam.detector.minsensitivity = 20;
}
if (!Directory.Exists(path2))
{
try
{
Directory.CreateDirectory(path2);
}
catch (IOException e)
{
Logger.LogExceptionToFile(e);
}
}
if (string.IsNullOrEmpty(cam.ftp.localfilename))
{
cam.ftp.localfilename = "{0:yyyy-MM-dd_HH-mm-ss_fff}.jpg";
}
if (string.IsNullOrEmpty(cam.settings.audiomodel))
cam.settings.audiomodel = "None";
if (string.IsNullOrEmpty(cam.settings.timestampfont))
{
cam.settings.timestampfont = FontXmlConverter.ConvertToString(Drawfont);
cam.settings.timestampshowback = true;
}
path2 = Helper.GetMediaDirectory(cam.settings.directoryIndex) + "video\\" + cam.directory + "\\thumbs\\";
if (!Directory.Exists(path2))
{
try
{
Directory.CreateDirectory(path2);
}
catch
{
// ignored
}
}
path2 = Helper.GetMediaDirectory(cam.settings.directoryIndex) + "video\\" + cam.directory + "\\grabs\\";
if (!Directory.Exists(path2))
{
try
{
Directory.CreateDirectory(path2);
}
catch
{
// ignored
}
}
if (cam.alerts.trigger == null)
cam.alerts.trigger = "";
if (string.IsNullOrEmpty(cam.rotateMode))
{
cam.rotateMode = "RotateNoneFlipNone";
if (cam.rotate90)
{
cam.rotateMode = RotateFlipType.Rotate90FlipNone.ToString();
}
if (cam.flipx)
{
cam.rotateMode = RotateFlipType.RotateNoneFlipX.ToString();
}
if (cam.flipy)
{
cam.rotateMode = RotateFlipType.RotateNoneFlipY.ToString();
}
if (cam.flipx && cam.flipy)
{
cam.rotateMode = RotateFlipType.RotateNoneFlipXY.ToString();
}
}
if (cam.settings.pip == null)
{
cam.settings.pip = new objectsCameraSettingsPip {enabled = false, config = ""};
}
}
int micid = 0;
foreach (objectsMicrophone mic in c.microphones)
{
if (mic.id >= micid)
micid = mic.id + 1;
if (mic.settings.order == -1)
{
mic.settings.order = MaxOrderIndex;
MaxOrderIndex++;
}
if (mic.directory == null)
throw new Exception("err_old_config");
mic.newrecordingcount = 0;
path2 = Helper.GetMediaDirectory(mic.settings.directoryIndex) + "audio\\" + mic.directory + "\\";
if (!Directory.Exists(path2))
Directory.CreateDirectory(path2);
if (mic.settings.accessgroups == null)
mic.settings.accessgroups = "";
if (mic.settings.storagemanagement == null)
{
mic.settings.storagemanagement = new objectsMicrophoneSettingsStoragemanagement
{
enabled = false,
maxage = 72,
maxsize = 1024
};
}
if (Math.Abs(mic.detector.minsensitivity - (-1)) < double.Epsilon)
{
mic.detector.minsensitivity = mic.detector.sensitivity;
mic.detector.maxsensitivity = 100;
}
if (mic.detector.minsensitivity > mic.detector.maxsensitivity)
{
//reset
mic.detector.maxsensitivity = 100;
mic.detector.minsensitivity = 20;
}
if (Conf.MediaDirectories.FirstOrDefault(p => p.ID == mic.settings.directoryIndex) == null)
mic.settings.directoryIndex = Conf.MediaDirectories.First().ID;
bool migrate = false;
if (mic.alertevents == null)
{
mic.alertevents = new objectsMicrophoneAlertevents();
migrate = true;
}
if (mic.alertevents.entries == null)
{
mic.alertevents.entries = new objectsMicrophoneAlerteventsEntry[] { };
}
if (migrate)
{
var l = new List<objectsMicrophoneAlerteventsEntry>();
if (!string.IsNullOrEmpty(mic.alerts.executefile))
{
l.Add(new objectsMicrophoneAlerteventsEntry { type = "Exe", param1 = mic.alerts.executefile, param2 = mic.alerts.arguments });
}
if (mic.notifications.sendemail)
{
l.Add(new objectsMicrophoneAlerteventsEntry { type = "E", param1 = mic.settings.emailaddress, param2 = "True" });
}
if (mic.notifications.sendsms)
{
l.Add(new objectsMicrophoneAlerteventsEntry { type = "SMS", param1 = mic.settings.smsnumber });
}
string[] alertOptions = mic.alerts.alertoptions.Split(','); //beep,restore
if (Convert.ToBoolean(alertOptions[0]))
l.Add(new objectsMicrophoneAlerteventsEntry { type = "B" });
if (Convert.ToBoolean(alertOptions[1]))
l.Add(new objectsMicrophoneAlerteventsEntry { type = "SW" });
if (mic.notifications.sendtwitter)
{
l.Add(new objectsMicrophoneAlerteventsEntry { type = "TM" });
}
if (!string.IsNullOrEmpty(mic.alerts.trigger))
{
l.Add(new objectsMicrophoneAlerteventsEntry { type = "TA", param1 = mic.alerts.trigger });
}
mic.alertevents = new objectsMicrophoneAlertevents() {entries = l.ToArray()};
}
if (string.IsNullOrEmpty(mic.settings.emailondisconnect))
{
if (mic.settings.notifyondisconnect)
{
mic.settings.emailondisconnect = mic.settings.emailaddress;
}
}
if (addActions)
{
var l = c.actions.entries.ToList();
l.AddRange(mic.alertevents.entries.Select(a => new objectsActionsEntry
{
mode = "alert",
objectid = mic.id,
objecttypeid = 1,
type = a.type,
param1 = a.param1,
param2 = a.param2,
param3 = a.param3,
param4 = a.param4,
ident = Guid.NewGuid().ToString()
}));
if (!string.IsNullOrEmpty(mic.settings.emailondisconnect))
{
l.Add(new objectsActionsEntry
{
mode = "disconnect",
objectid = mic.id,
objecttypeid = 1,
type = "E",
param1 = mic.settings.emailondisconnect,
param2 = "False",
ident = Guid.NewGuid().ToString()
});
}
c.actions.entries = l.ToArray();
}
if (mic.x < 0)
mic.x = 0;
if (mic.y < 0)
mic.y = 0;
if (mic.settings.gain <= 0)
mic.settings.gain = 1;
if (mic.alerts.trigger == null)
mic.alerts.trigger = "";
}
foreach (var aa in c.actions.entries)
{
if (string.IsNullOrEmpty(aa.ident))
aa.ident = Guid.NewGuid().ToString();
}
int fpid = 0;
foreach (objectsFloorplan ofp in c.floorplans)
{
if (ofp.id >= fpid)
fpid = ofp.id + 1;
if (ofp.x < 0)
ofp.x = 0;
if (ofp.y < 0)
ofp.y = 0;
if (ofp.accessgroups == null)
ofp.accessgroups = "";
if (ofp.order == -1)
{
ofp.order = MaxOrderIndex;
MaxOrderIndex++;
}
}
int rcid = 0;
foreach (objectsCommand ocmd in c.remotecommands)
{
if (ocmd.id >= rcid)
rcid = ocmd.id + 1;
}
if (addSchedule)
{
var l = new List<objectsScheduleEntry>();
foreach (var o in c.cameras)
{
foreach (var se in o.schedule.entries)
{
for (int i = 0; i < 10; i++)
{
bool startSpecified = se.start.Split(':')[0] != "-";
bool stopSpecified = se.stop.Split(':')[0] != "-";
if (!startSpecified && !stopSpecified)
continue;
var ose = new objectsScheduleEntry
{
objectid = o.id,
objecttypeid = 2,
daysofweek = se.daysofweek,
active = se.active,
parameter = "",
typeid = -1,
time = ParseTime(startSpecified ? se.start : se.stop)
};
switch (i)
{
case 0: //power on
if (startSpecified)
ose.typeid = 0;
break;
case 1: //power off
if (stopSpecified)
{
ose.time = ParseTime(se.stop);
ose.typeid = 1;
}
break;
case 2:
ose.typeid = se.alerts ? 7 : 8;
break;
case 3:
ose.typeid = se.ftpenabled ? 13 : 14;
break;
case 4:
ose.typeid = se.messaging ? 21 : 22;
break;
case 5:
ose.typeid = se.ptz ? 19 : 20;
break;
case 6:
if (se.recordonalert)
ose.typeid = 5;
else
{
ose.typeid = se.recordondetect ? 4 : 6;
}
break;
case 7:
if (se.recordonstart)
ose.typeid = 2;
break;
case 8:
ose.typeid = se.savelocalenabled ? 17 : 18;
break;
case 9:
ose.typeid = se.timelapseenabled ? 11 : 12;
break;
}
if (ose.typeid > -1)
l.Add(ose);
}
}
}
foreach (var o in c.microphones)
{
foreach (var se in o.schedule.entries)
{
for (int i = 0; i < 10; i++)
{
var ose = new objectsScheduleEntry
{
objectid = o.id,
objecttypeid = 1,
daysofweek = se.daysofweek,
active = se.active,
parameter = "",
typeid = -1
};
bool startSpecified = se.start.Split(':')[0] != "-";
bool stopSpecified = se.stop.Split(':')[0] != "-";
ose.time = ParseTime(startSpecified ? se.start : se.stop);
switch (i)
{
case 0: //power on
if (startSpecified)
ose.typeid = 0;
break;
case 1: //power off
if (stopSpecified)
{
ose.time = ParseTime(se.stop);
ose.typeid = 1;
}
break;
case 2:
ose.typeid = se.alerts ? 7 : 8;
break;
case 4:
ose.typeid = se.messaging ? 21 : 22;
break;
case 6:
if (se.recordonalert)
ose.typeid = 5;
else
{
ose.typeid = se.recordondetect ? 4 : 6;
}
break;
case 7:
if (se.recordonstart)
ose.typeid = 2;
break;
}
if (ose.typeid > -1)
l.Add(ose);
}
}
}
c.schedule = new objectsSchedule() {entries = l.ToArray()};
}
if (bAlertVlc)
{
MessageBox.Show(Program.Platform == "x64"
? LocRm.GetString("InstallVLCx64")
.Replace("[DIR]", Environment.NewLine + Program.AppPath + "VLC64" + Environment.NewLine)
: LocRm.GetString("InstallVLCx86"));
OpenUrl(Program.Platform == "x64" ? VLCx64 : VLCx86);
}
SaveConfig();
NeedsSync = true;
Logger.LogMessageToFile("Loaded " + c.cameras.Length + " cameras, " + c.microphones.Length + " mics and " + c.floorplans.Length + " floorplans");
return c;
}