git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 16 Nov 2017 16:07:57 +0000 (16:07 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Thu, 16 Nov 2017 16:07:57 +0000 (16:07 +0000)
56 files changed:
client/DxPlay/DxPlay.csproj
client/DxPlay/PlayerForm.Designer.cs
client/DxPlay/PlayerForm.cs
client/DxPlay/Properties/Resources.Designer.cs
client/DxPlay/Properties/Resources.resx
client/DxPlay/Resources/ic_pause_black_24dp_1x.png [new file with mode: 0644]
client/DxPlay/Resources/ic_pause_black_24dp_2x.png [new file with mode: 0644]
client/DxPlay/Resources/ic_play_arrow_black_24dp_1x.png [new file with mode: 0644]
client/DxPlay/Resources/ic_play_arrow_black_24dp_2x.png [new file with mode: 0644]
client/DxPlay/Resources/ic_stop_black_24dp_1x.png [new file with mode: 0644]
client/DxPlay/Resources/ic_stop_black_24dp_2x.png [new file with mode: 0644]
client/DxPlay/StringResource.Designer.cs
client/DxPlay/StringResource.resx
client/IntegrationTests/IntegrationTests.csproj
client/IntegrationTests/MaestroIT.cs
client/Maestro/Commons/MorpheusXML.cs
client/Maestro/Commons/WindowsIdentityMembers.cs [new file with mode: 0644]
client/Maestro/Configuration/ConfigurationInfo.cs
client/Maestro/Configuration/configuration-editor.json
client/Maestro/Configuration/configuration-nle.json
client/Maestro/Configuration/configuration-playout.json
client/Maestro/Configuration/configuration-sxs.json
client/Maestro/Configuration/global.json
client/Maestro/LoginForm.Designer.cs [new file with mode: 0644]
client/Maestro/LoginForm.cs [new file with mode: 0644]
client/Maestro/LoginForm.resx [new file with mode: 0644]
client/Maestro/Maestro.csproj
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/MaestroForm.Source.cs
client/Maestro/Program.cs
client/Maestro/Properties/DataSources/LoginForm.datasource [new file with mode: 0644]
client/Maestro/Properties/Resources.Designer.cs
client/Maestro/Properties/Resources.resx
client/Maestro/Resources/installforge-installer-project.ifp
client/Maestro/Resources/mediacube_logo_v2_half_hard_edge.png [new file with mode: 0644]
client/Maestro/Splash.Designer.cs
client/Maestro/Splash.cs
client/Maestro/Splash.resx
client/Maestro/Targets/FTPTargetProcessor.cs
client/Maestro/Targets/UNCTargetProcessor.cs
client/OctopusClient/OctopusIDSelector.cs
client/PlanAIRClient/TrafficIDSelector.cs
server/-configuration/dsm.opt
server/-product/log4j2.xml
server/-product/mediacube.product
server/-product/pom.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/TSMBackupStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TSMRestoreStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeSELENIOStep.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusAPI.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobStepExecutor.java
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/KillDateFile.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/jobengine/JobengineService.java
server/user.tsm.client/META-INF/MANIFEST.MF
server/user.tsm.client/src/user/tsm/client/TSMBufferedClient.java

index 43376c7c33e2f21f261413821e817cd428eb2d0f..504dc315d021c7672a175bc844f47bf09a57c96b 100644 (file)
     </Compile>\r
     <Content Include="DirectShowLib.dll" />\r
     <Content Include="maestro.ico" />\r
+    <None Include="Resources\ic_stop_black_24dp_2x.png" />\r
+    <None Include="Resources\ic_play_arrow_black_24dp_2x.png" />\r
+    <None Include="Resources\ic_pause_black_24dp_2x.png" />\r
+    <None Include="Resources\ic_stop_black_24dp_1x.png" />\r
+    <None Include="Resources\ic_play_arrow_black_24dp_1x.png" />\r
+    <None Include="Resources\ic_pause_black_24dp_1x.png" />\r
     <EmbeddedResource Include="StringResource.resx">\r
       <Generator>ResXFileCodeGenerator</Generator>\r
       <LastGenOutput>StringResource.Designer.cs</LastGenOutput>\r
index 7dfe28400e639d95d10512c7a8e153ae20a8022e..4f651645df2852fa32b39c59983383eea68ddbab 100644 (file)
@@ -3,10 +3,9 @@ using System.Windows.Forms;
 \r
 namespace DxPlay {\r
     partial class PlayerForm : Form {\r
-        private Panel panelVideo;\r
+        private Panel pVideo;\r
         private Button btnPlay;\r
         private Button btnPause;\r
-        private Panel panel2;\r
         private TextBox textCurrentTC;\r
         private Button btnStop;\r
         private TextBox txtStartTC;\r
@@ -40,21 +39,21 @@ namespace DxPlay {
             this.components = new System.ComponentModel.Container();\r
             System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();\r
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PlayerForm));\r
-            this.panelVideo = new System.Windows.Forms.Panel();\r
-            this.panel2 = new System.Windows.Forms.Panel();\r
-            this.btnStop = new System.Windows.Forms.Button();\r
-            this.btnPlay = new System.Windows.Forms.Button();\r
-            this.btnPause = new System.Windows.Forms.Button();\r
+            this.pVideo = new System.Windows.Forms.Panel();\r
             this.textCurrentTC = new System.Windows.Forms.TextBox();\r
             this.txtStartTC = new System.Windows.Forms.TextBox();\r
             this.txtEndTC = new System.Windows.Forms.TextBox();\r
             this.panel3 = new System.Windows.Forms.Panel();\r
             this.labelStatus = new System.Windows.Forms.Label();\r
+            this.trackBar1 = new DxPlay.ColorSlider();\r
             this.label2 = new System.Windows.Forms.Label();\r
             this.label1 = new System.Windows.Forms.Label();\r
-            this.trackBar1 = new DxPlay.ColorSlider();\r
             this.splitContainer1 = new System.Windows.Forms.SplitContainer();\r
             this.panelPlayer = new System.Windows.Forms.Panel();\r
+            this.pControls = new System.Windows.Forms.FlowLayoutPanel();\r
+            this.btnPlay = new System.Windows.Forms.Button();\r
+            this.btnStop = new System.Windows.Forms.Button();\r
+            this.btnPause = new System.Windows.Forms.Button();\r
             this.dgSegments = new System.Windows.Forms.DataGridView();\r
             this.bsSegments = new System.Windows.Forms.BindingSource(this.components);\r
             this.menuButtonSegmentActions = new DxPlay.MenuButton();\r
@@ -64,90 +63,48 @@ namespace DxPlay {
             this.deleteSegmentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.actualPositionToIntroToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.actualPositionToOutroToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.panel2.SuspendLayout();\r
             this.panel3.SuspendLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();\r
             this.splitContainer1.Panel1.SuspendLayout();\r
             this.splitContainer1.Panel2.SuspendLayout();\r
             this.splitContainer1.SuspendLayout();\r
             this.panelPlayer.SuspendLayout();\r
+            this.pControls.SuspendLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.dgSegments)).BeginInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.bsSegments)).BeginInit();\r
             this.ctxmSegmentActions.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
-            // panelVideo\r
-            // \r
-            this.panelVideo.BackColor = System.Drawing.Color.Black;\r
-            this.panelVideo.Dock = System.Windows.Forms.DockStyle.Fill;\r
-            this.panelVideo.Location = new System.Drawing.Point(0, 0);\r
-            this.panelVideo.Name = "panelVideo";\r
-            this.panelVideo.Size = new System.Drawing.Size(675, 447);\r
-            this.panelVideo.TabIndex = 10;\r
-            this.panelVideo.TabStop = true;\r
-            this.panelVideo.SizeChanged += new System.EventHandler(this.panel1_SizeChanged);\r
-            this.panelVideo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);\r
-            // \r
-            // panel2\r
-            // \r
-            this.panel2.BackColor = System.Drawing.SystemColors.Control;\r
-            this.panel2.Controls.Add(this.btnStop);\r
-            this.panel2.Controls.Add(this.btnPlay);\r
-            this.panel2.Controls.Add(this.btnPause);\r
-            this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;\r
-            this.panel2.Location = new System.Drawing.Point(0, 510);\r
-            this.panel2.Name = "panel2";\r
-            this.panel2.Size = new System.Drawing.Size(675, 34);\r
-            this.panel2.TabIndex = 14;\r
+            // pVideo\r
             // \r
-            // btnStop\r
-            // \r
-            this.btnStop.Image = global::DxPlay.Properties.Resources.Stop;\r
-            this.btnStop.Location = new System.Drawing.Point(89, 3);\r
-            this.btnStop.Name = "btnStop";\r
-            this.btnStop.Size = new System.Drawing.Size(80, 25);\r
-            this.btnStop.TabIndex = 16;\r
-            this.btnStop.Text = "Stop";\r
-            this.btnStop.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
-            this.btnStop.Click += new System.EventHandler(this.btnStop_Click);\r
-            // \r
-            // btnPlay\r
-            // \r
-            this.btnPlay.Image = global::DxPlay.Properties.Resources.Play;\r
-            this.btnPlay.Location = new System.Drawing.Point(3, 3);\r
-            this.btnPlay.Name = "btnPlay";\r
-            this.btnPlay.Size = new System.Drawing.Size(80, 25);\r
-            this.btnPlay.TabIndex = 1;\r
-            this.btnPlay.Text = "Play";\r
-            this.btnPlay.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
-            this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);\r
-            // \r
-            // btnPause\r
-            // \r
-            this.btnPause.Image = global::DxPlay.Properties.Resources.Pause;\r
-            this.btnPause.Location = new System.Drawing.Point(175, 3);\r
-            this.btnPause.Name = "btnPause";\r
-            this.btnPause.Size = new System.Drawing.Size(80, 25);\r
-            this.btnPause.TabIndex = 11;\r
-            this.btnPause.Text = "Pause";\r
-            this.btnPause.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
-            this.btnPause.Click += new System.EventHandler(this.btnPause_Click);\r
+            this.pVideo.BackColor = System.Drawing.Color.Black;\r
+            this.pVideo.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.pVideo.Location = new System.Drawing.Point(0, 0);\r
+            this.pVideo.Name = "pVideo";\r
+            this.pVideo.Size = new System.Drawing.Size(675, 433);\r
+            this.pVideo.TabIndex = 10;\r
+            this.pVideo.TabStop = true;\r
+            this.pVideo.SizeChanged += new System.EventHandler(this.panel1_SizeChanged);\r
+            this.pVideo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);\r
             // \r
             // textCurrentTC\r
             // \r
-            this.textCurrentTC.Anchor = System.Windows.Forms.AnchorStyles.Top;\r
+            this.textCurrentTC.Anchor = System.Windows.Forms.AnchorStyles.Bottom;\r
+            this.textCurrentTC.BackColor = System.Drawing.Color.White;\r
             this.textCurrentTC.BorderStyle = System.Windows.Forms.BorderStyle.None;\r
             this.textCurrentTC.Font = new System.Drawing.Font("Calibri", 16F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
-            this.textCurrentTC.Location = new System.Drawing.Point(284, 13);\r
+            this.textCurrentTC.Location = new System.Drawing.Point(284, 12);\r
             this.textCurrentTC.Name = "textCurrentTC";\r
             this.textCurrentTC.ReadOnly = true;\r
             this.textCurrentTC.Size = new System.Drawing.Size(108, 27);\r
             this.textCurrentTC.TabIndex = 15;\r
+            this.textCurrentTC.TabStop = false;\r
             this.textCurrentTC.Text = "00:00:00.00";\r
             // \r
             // txtStartTC\r
             // \r
             this.txtStartTC.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r
+            this.txtStartTC.BackColor = System.Drawing.Color.White;\r
             this.txtStartTC.BorderStyle = System.Windows.Forms.BorderStyle.None;\r
             this.txtStartTC.Font = new System.Drawing.Font("Calibri", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
             this.txtStartTC.ForeColor = System.Drawing.SystemColors.WindowText;\r
@@ -156,67 +113,51 @@ namespace DxPlay {
             this.txtStartTC.ReadOnly = true;\r
             this.txtStartTC.Size = new System.Drawing.Size(66, 17);\r
             this.txtStartTC.TabIndex = 16;\r
+            this.txtStartTC.TabStop = false;\r
             this.txtStartTC.Text = "00:00:00.00";\r
             // \r
             // txtEndTC\r
             // \r
             this.txtEndTC.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.txtEndTC.BackColor = System.Drawing.Color.White;\r
             this.txtEndTC.BorderStyle = System.Windows.Forms.BorderStyle.None;\r
             this.txtEndTC.Font = new System.Drawing.Font("Calibri", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
             this.txtEndTC.ForeColor = System.Drawing.SystemColors.WindowText;\r
-            this.txtEndTC.Location = new System.Drawing.Point(603, 21);\r
+            this.txtEndTC.Location = new System.Drawing.Point(605, 24);\r
             this.txtEndTC.Name = "txtEndTC";\r
             this.txtEndTC.ReadOnly = true;\r
             this.txtEndTC.Size = new System.Drawing.Size(65, 17);\r
             this.txtEndTC.TabIndex = 17;\r
+            this.txtEndTC.TabStop = false;\r
             this.txtEndTC.Text = "00:00:00.00";\r
+            this.txtEndTC.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\r
             // \r
             // panel3\r
             // \r
             this.panel3.Controls.Add(this.labelStatus);\r
+            this.panel3.Controls.Add(this.trackBar1);\r
             this.panel3.Controls.Add(this.label2);\r
             this.panel3.Controls.Add(this.label1);\r
             this.panel3.Controls.Add(this.txtStartTC);\r
             this.panel3.Controls.Add(this.txtEndTC);\r
             this.panel3.Controls.Add(this.textCurrentTC);\r
             this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom;\r
-            this.panel3.Location = new System.Drawing.Point(0, 447);\r
+            this.panel3.Location = new System.Drawing.Point(0, 433);\r
             this.panel3.Name = "panel3";\r
-            this.panel3.Size = new System.Drawing.Size(675, 41);\r
+            this.panel3.Size = new System.Drawing.Size(675, 51);\r
             this.panel3.TabIndex = 19;\r
             // \r
             // labelStatus\r
             // \r
-            this.labelStatus.Anchor = System.Windows.Forms.AnchorStyles.Top;\r
+            this.labelStatus.Anchor = System.Windows.Forms.AnchorStyles.Bottom;\r
             this.labelStatus.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
-            this.labelStatus.Location = new System.Drawing.Point(281, 5);\r
+            this.labelStatus.Location = new System.Drawing.Point(281, 4);\r
             this.labelStatus.Name = "labelStatus";\r
             this.labelStatus.Size = new System.Drawing.Size(111, 13);\r
             this.labelStatus.TabIndex = 20;\r
             this.labelStatus.Text = "NO INPUT";\r
             this.labelStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\r
             // \r
-            // label2\r
-            // \r
-            this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.label2.AutoSize = true;\r
-            this.label2.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
-            this.label2.Location = new System.Drawing.Point(618, 5);\r
-            this.label2.Name = "label2";\r
-            this.label2.Size = new System.Drawing.Size(54, 13);\r
-            this.label2.TabIndex = 19;\r
-            this.label2.Text = "DURATION";\r
-            // \r
-            // label1\r
-            // \r
-            this.label1.AutoSize = true;\r
-            this.label1.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
-            this.label1.Location = new System.Drawing.Point(4, 6);\r
-            this.label1.Name = "label1";\r
-            this.label1.Size = new System.Drawing.Size(33, 13);\r
-            this.label1.TabIndex = 18;\r
-            this.label1.Text = "START";\r
-            // \r
             // trackBar1\r
             // \r
             this.trackBar1.BackColor = System.Drawing.Color.Transparent;\r
@@ -228,10 +169,10 @@ namespace DxPlay {
             this.trackBar1.ElapsedInnerColor = System.Drawing.Color.Black;\r
             this.trackBar1.ElapsedOuterColor = System.Drawing.Color.DarkGray;\r
             this.trackBar1.LargeChange = ((uint)(0u));\r
-            this.trackBar1.Location = new System.Drawing.Point(0, 488);\r
+            this.trackBar1.Location = new System.Drawing.Point(0, 41);\r
             this.trackBar1.Maximum = 1;\r
             this.trackBar1.Name = "trackBar1";\r
-            this.trackBar1.Size = new System.Drawing.Size(675, 22);\r
+            this.trackBar1.Size = new System.Drawing.Size(675, 10);\r
             this.trackBar1.SmallChange = ((uint)(1u));\r
             this.trackBar1.TabIndex = 18;\r
             this.trackBar1.Text = "colorSlider1";\r
@@ -244,6 +185,28 @@ namespace DxPlay {
             this.trackBar1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.trackBar1_MouseDown);\r
             this.trackBar1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.trackBar1_MouseUp);\r
             // \r
+            // label2\r
+            // \r
+            this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.label2.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
+            this.label2.Location = new System.Drawing.Point(605, 5);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(68, 13);\r
+            this.label2.TabIndex = 19;\r
+            this.label2.Text = "DURATION";\r
+            this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));\r
+            this.label1.Font = new System.Drawing.Font("Calibri", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
+            this.label1.Location = new System.Drawing.Point(3, 5);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(69, 13);\r
+            this.label1.TabIndex = 18;\r
+            this.label1.Text = "START";\r
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\r
+            // \r
             // splitContainer1\r
             // \r
             this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;\r
@@ -264,16 +227,71 @@ namespace DxPlay {
             // \r
             // panelPlayer\r
             // \r
-            this.panelPlayer.Controls.Add(this.panelVideo);\r
+            this.panelPlayer.Controls.Add(this.pVideo);\r
             this.panelPlayer.Controls.Add(this.panel3);\r
-            this.panelPlayer.Controls.Add(this.trackBar1);\r
-            this.panelPlayer.Controls.Add(this.panel2);\r
+            this.panelPlayer.Controls.Add(this.pControls);\r
             this.panelPlayer.Dock = System.Windows.Forms.DockStyle.Fill;\r
             this.panelPlayer.Location = new System.Drawing.Point(0, 0);\r
             this.panelPlayer.Name = "panelPlayer";\r
             this.panelPlayer.Size = new System.Drawing.Size(675, 544);\r
             this.panelPlayer.TabIndex = 0;\r
             // \r
+            // pControls\r
+            // \r
+            this.pControls.AutoSize = true;\r
+            this.pControls.Controls.Add(this.btnPlay);\r
+            this.pControls.Controls.Add(this.btnStop);\r
+            this.pControls.Controls.Add(this.btnPause);\r
+            this.pControls.Dock = System.Windows.Forms.DockStyle.Bottom;\r
+            this.pControls.Location = new System.Drawing.Point(0, 484);\r
+            this.pControls.Name = "pControls";\r
+            this.pControls.Size = new System.Drawing.Size(675, 60);\r
+            this.pControls.TabIndex = 20;\r
+            // \r
+            // btnPlay\r
+            // \r
+            this.btnPlay.AutoSize = true;\r
+            this.btnPlay.BackColor = System.Drawing.Color.White;\r
+            this.btnPlay.FlatAppearance.BorderSize = 0;\r
+            this.btnPlay.Image = global::DxPlay.Properties.Resources.ic_play_arrow_black_24dp_2x;\r
+            this.btnPlay.Location = new System.Drawing.Point(3, 3);\r
+            this.btnPlay.Name = "btnPlay";\r
+            this.btnPlay.Size = new System.Drawing.Size(54, 54);\r
+            this.btnPlay.TabIndex = 1;\r
+            this.btnPlay.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
+            this.btnPlay.UseVisualStyleBackColor = false;\r
+            this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);\r
+            // \r
+            // btnStop\r
+            // \r
+            this.btnStop.AutoSize = true;\r
+            this.btnStop.BackColor = System.Drawing.Color.White;\r
+            this.btnStop.FlatAppearance.BorderSize = 0;\r
+            this.btnStop.FlatStyle = System.Windows.Forms.FlatStyle.Popup;\r
+            this.btnStop.Image = global::DxPlay.Properties.Resources.ic_stop_black_24dp_2x;\r
+            this.btnStop.Location = new System.Drawing.Point(63, 3);\r
+            this.btnStop.Name = "btnStop";\r
+            this.btnStop.Size = new System.Drawing.Size(54, 54);\r
+            this.btnStop.TabIndex = 16;\r
+            this.btnStop.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
+            this.btnStop.UseVisualStyleBackColor = false;\r
+            this.btnStop.Click += new System.EventHandler(this.btnStop_Click);\r
+            // \r
+            // btnPause\r
+            // \r
+            this.btnPause.AutoSize = true;\r
+            this.btnPause.BackColor = System.Drawing.Color.White;\r
+            this.btnPause.FlatAppearance.BorderSize = 0;\r
+            this.btnPause.FlatStyle = System.Windows.Forms.FlatStyle.Popup;\r
+            this.btnPause.Image = global::DxPlay.Properties.Resources.ic_pause_black_24dp_2x;\r
+            this.btnPause.Location = new System.Drawing.Point(123, 3);\r
+            this.btnPause.Name = "btnPause";\r
+            this.btnPause.Size = new System.Drawing.Size(54, 54);\r
+            this.btnPause.TabIndex = 11;\r
+            this.btnPause.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;\r
+            this.btnPause.UseVisualStyleBackColor = false;\r
+            this.btnPause.Click += new System.EventHandler(this.btnPause_Click);\r
+            // \r
             // dgSegments\r
             // \r
             this.dgSegments.AllowUserToAddRows = false;\r
@@ -366,6 +384,7 @@ namespace DxPlay {
             // \r
             this.AllowDrop = true;\r
             this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);\r
+            this.BackColor = System.Drawing.Color.White;\r
             this.ClientSize = new System.Drawing.Size(936, 544);\r
             this.Controls.Add(this.splitContainer1);\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
@@ -382,7 +401,6 @@ namespace DxPlay {
             this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);\r
             this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PlayerForm_KeyDown);\r
             this.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.PlayerForm_PreviewKeyDown);\r
-            this.panel2.ResumeLayout(false);\r
             this.panel3.ResumeLayout(false);\r
             this.panel3.PerformLayout();\r
             this.splitContainer1.Panel1.ResumeLayout(false);\r
@@ -390,6 +408,9 @@ namespace DxPlay {
             ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();\r
             this.splitContainer1.ResumeLayout(false);\r
             this.panelPlayer.ResumeLayout(false);\r
+            this.panelPlayer.PerformLayout();\r
+            this.pControls.ResumeLayout(false);\r
+            this.pControls.PerformLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.dgSegments)).EndInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.bsSegments)).EndInit();\r
             this.ctxmSegmentActions.ResumeLayout(false);\r
@@ -412,6 +433,7 @@ namespace DxPlay {
         private ToolStripMenuItem deleteSegmentToolStripMenuItem;\r
         private ToolStripMenuItem actualPositionToIntroToolStripMenuItem;\r
         private ToolStripMenuItem actualPositionToOutroToolStripMenuItem;\r
+        private FlowLayoutPanel pControls;\r
     }\r
 }\r
 \r
index f3965e63e63169004541bb0a9d7a9c8ba6b31426..4bea8a2ba722638711339783603de7846539c4c0 100644 (file)
@@ -49,9 +49,9 @@ namespace DxPlay {
             deleteSegmentToolStripMenuItem.Text = StringResource.SZEGMENS_TORLESE;\r
             menuButtonSegmentActions.Text = StringResource.SZEGMENSEK;\r
 \r
-            btnPause.Text = StringResource.SZUNET;\r
-            btnPlay.Text = StringResource.LEJATSZAS;\r
-            btnStop.Text = StringResource.LEALLITAS;\r
+            //btnPause.Text = StringResource.SZUNET;\r
+            //btnPlay.Text = StringResource.LEJATSZAS;\r
+            //btnStop.Text = StringResource.LEALLITAS;\r
             labelStatus.Text = StringResource.NINCS_BEMENET;\r
             label1.Text = StringResource.INDULASI_PONT;\r
             label2.Text = StringResource.HOSSZ;\r
@@ -65,7 +65,7 @@ namespace DxPlay {
 \r
                 trackBar1.Value = 0;\r
                 trackBar1.Minimum = 0;\r
-                m_play = new DxPlayer(panelVideo, ref m_mediaDescription);\r
+                m_play = new DxPlayer(pVideo, ref m_mediaDescription);\r
                 if (m_play.IsError)\r
                     throw new Exception(selectedFile);                \r
 \r
@@ -155,7 +155,7 @@ namespace DxPlay {
 \r
         private void panel1_SizeChanged(object sender, EventArgs e) {\r
             if (m_play != null)\r
-                m_play.UpdateVideoWindow(panelVideo);\r
+                m_play.UpdateVideoWindow(pVideo);\r
         }\r
 \r
         private void trackBar1_MouseDown(object sender, MouseEventArgs e) {\r
index 35fa24ad07d6a25b0d55814b320780f5b8f12d23..a26553f56297ec7342782e1068a7735934de4bde 100644 (file)
@@ -60,6 +60,66 @@ namespace DxPlay.Properties {
             }\r
         }\r
         \r
+        /// <summary>\r
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
+        /// </summary>\r
+        public static System.Drawing.Bitmap ic_pause_black_24dp_1x {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ic_pause_black_24dp_1x", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
+        /// </summary>\r
+        public static System.Drawing.Bitmap ic_pause_black_24dp_2x {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ic_pause_black_24dp_2x", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
+        /// </summary>\r
+        public static System.Drawing.Bitmap ic_play_arrow_black_24dp_1x {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ic_play_arrow_black_24dp_1x", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
+        /// </summary>\r
+        public static System.Drawing.Bitmap ic_play_arrow_black_24dp_2x {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ic_play_arrow_black_24dp_2x", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
+        /// </summary>\r
+        public static System.Drawing.Bitmap ic_stop_black_24dp_1x {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ic_stop_black_24dp_1x", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
+        /// </summary>\r
+        public static System.Drawing.Bitmap ic_stop_black_24dp_2x {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ic_stop_black_24dp_2x", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
         /// <summary>\r
         ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
         /// </summary>\r
index 0437d4d75588802a92644953fbc1e89e963605b8..7082277df537c9e871544200d0b32bf20517f157 100644 (file)
   <data name="Stop" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
     <value>..\Resources\Stop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
   </data>\r
+  <data name="ic_pause_black_24dp_1x" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\ic_pause_black_24dp_1x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="ic_pause_black_24dp_2x" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\ic_pause_black_24dp_2x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="ic_play_arrow_black_24dp_1x" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\ic_play_arrow_black_24dp_1x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="ic_play_arrow_black_24dp_2x" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\ic_play_arrow_black_24dp_2x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="ic_stop_black_24dp_1x" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\ic_stop_black_24dp_1x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="ic_stop_black_24dp_2x" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\ic_stop_black_24dp_2x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
 </root>
\ No newline at end of file
diff --git a/client/DxPlay/Resources/ic_pause_black_24dp_1x.png b/client/DxPlay/Resources/ic_pause_black_24dp_1x.png
new file mode 100644 (file)
index 0000000..6145664
Binary files /dev/null and b/client/DxPlay/Resources/ic_pause_black_24dp_1x.png differ
diff --git a/client/DxPlay/Resources/ic_pause_black_24dp_2x.png b/client/DxPlay/Resources/ic_pause_black_24dp_2x.png
new file mode 100644 (file)
index 0000000..74068ea
Binary files /dev/null and b/client/DxPlay/Resources/ic_pause_black_24dp_2x.png differ
diff --git a/client/DxPlay/Resources/ic_play_arrow_black_24dp_1x.png b/client/DxPlay/Resources/ic_play_arrow_black_24dp_1x.png
new file mode 100644 (file)
index 0000000..d78c57b
Binary files /dev/null and b/client/DxPlay/Resources/ic_play_arrow_black_24dp_1x.png differ
diff --git a/client/DxPlay/Resources/ic_play_arrow_black_24dp_2x.png b/client/DxPlay/Resources/ic_play_arrow_black_24dp_2x.png
new file mode 100644 (file)
index 0000000..f208795
Binary files /dev/null and b/client/DxPlay/Resources/ic_play_arrow_black_24dp_2x.png differ
diff --git a/client/DxPlay/Resources/ic_stop_black_24dp_1x.png b/client/DxPlay/Resources/ic_stop_black_24dp_1x.png
new file mode 100644 (file)
index 0000000..0588f0b
Binary files /dev/null and b/client/DxPlay/Resources/ic_stop_black_24dp_1x.png differ
diff --git a/client/DxPlay/Resources/ic_stop_black_24dp_2x.png b/client/DxPlay/Resources/ic_stop_black_24dp_2x.png
new file mode 100644 (file)
index 0000000..b002ab7
Binary files /dev/null and b/client/DxPlay/Resources/ic_stop_black_24dp_2x.png differ
index c4c11017848d5aa71398120e76af2acabb49ff85..8b057bc4df5e1d313757a1f462127ce7c4194d10 100644 (file)
@@ -115,7 +115,7 @@ namespace DxPlay {
         }\r
         \r
         /// <summary>\r
-        ///   Looks up a localized string similar to Indulási pont.\r
+        ///   Looks up a localized string similar to Kezdés.\r
         /// </summary>\r
         internal static string INDULASI_PONT {\r
             get {\r
index 7c58c97dd2944ecb31f39cebeaa395042b78302f..f1442fd47ddee9c4900d90b2a4395b5f2fd6fcfd 100644 (file)
     <value>Indítás</value>\r
   </data>\r
   <data name="INDULASI_PONT" xml:space="preserve">\r
-    <value>Indulási pont</value>\r
+    <value>Kezdés</value>\r
   </data>\r
   <data name="KILEPES" xml:space="preserve">\r
     <value>Kilépés</value>\r
index 13d952e02c10ebb4c04e0fbee8ffee7af5ba8f76..e086cdb7ef61b21be3321996fe838a20568c637d 100644 (file)
     <Reference Include="MongoDB.Driver.Core, Version=2.4.4.0, Culture=neutral, processorArchitecture=MSIL">\r
       <HintPath>..\packages\MongoDB.Driver.Core.2.4.4\lib\net45\MongoDB.Driver.Core.dll</HintPath>\r
     </Reference>\r
+    <Reference Include="mysql.data, Version=5.2.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">\r
+      <SpecificVersion>False</SpecificVersion>\r
+      <HintPath>lib\mysql.data.dll</HintPath>\r
+    </Reference>\r
     <Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">\r
       <HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>\r
     </Reference>\r
       <HintPath>..\packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>\r
     </Reference>\r
     <Reference Include="System.Core" />\r
+    <Reference Include="System.Data" />\r
     <Reference Include="System.Net.NameResolution, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">\r
       <HintPath>..\packages\System.Net.NameResolution.4.3.0\lib\net46\System.Net.NameResolution.dll</HintPath>\r
     </Reference>\r
   <ItemGroup>\r
     <WCFMetadata Include="Connected Services\" />\r
   </ItemGroup>\r
+  <ItemGroup>\r
+    <Content Include="lib\mysql.data.dll" />\r
+  </ItemGroup>\r
   <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />\r
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">\r
index 580337b911e49db845bc686f1fd05e5c6cb73a2d..6615d49eb6d67b779e92a1c5b724fea35efa83d5 100644 (file)
@@ -14,6 +14,8 @@ using System.Security;
 using BethesdaConsentFormWCFSvc;\r
 using System.IO;\r
 using System.Text.RegularExpressions;\r
+using MySql.Data.MySqlClient;\r
+using System.Text;\r
 \r
 namespace IntegrationTests {\r
     public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid {\r
@@ -234,6 +236,45 @@ namespace IntegrationTests {
             string[] files = Directory.GetFiles("\\\\10.10.1.100\\BRAAVOS\\Archive");\r
         }\r
 \r
+        [TestMethod]\r
+        public void TestMySQL() {\r
+            string server = "192.168.3.10";\r
+            string database = "echotv";\r
+            string uid = "vasary";\r
+            string password = "vasarydani";\r
+            string connectionString = "SERVER=" + server + ";" + "DATABASE=" +\r
+            database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";Convert Zero Datetime=true;";\r
+\r
+            \r
+            MySqlConnection connection = new MySqlConnection(connectionString);\r
+            try {\r
+                connection.Open();\r
+                //Query(connection, "SHOW TABLES;");\r
+                Query(connection, "SELECT * FROM archive_records;");\r
+                connection.Close();\r
+            }\r
+            catch (MySqlException ex) {\r
+                Debug.WriteLine(ex.Message);\r
+            }\r
+        }\r
+\r
 \r
+        private void Query(MySqlConnection connection, string sql) {\r
+            MySqlCommand command = connection.CreateCommand();\r
+            command.CommandText = sql;\r
+            MySqlDataReader Reader = command.ExecuteReader();\r
+            StringBuilder sb = new StringBuilder();\r
+            while (Reader.Read()) {\r
+                for (int i = 0; i < Reader.FieldCount; i++) {\r
+                    if (Reader.IsDBNull(i))\r
+                        sb.Append("null, ");\r
+                    else\r
+                        sb.Append(Reader.GetValue(i).ToString() + ", ");\r
+                }\r
+\r
+                Debug.WriteLine(sb.ToString());\r
+                sb.Clear();\r
+            }\r
+        }\r
     }\r
-}
\ No newline at end of file
+    }
\ No newline at end of file
index 71b314a3ecd57bc2719333855046e31825e1fa3e..828911af1dbbb67eb2c9a3379407e8e891d89a4d 100644 (file)
@@ -1,4 +1,5 @@
 using DxPlay;\r
+using Maestro.Metadata;\r
 using System;\r
 using System.Collections.Generic;\r
 using System.Globalization;\r
@@ -14,6 +15,7 @@ using System.Xml;
       <Material_Id>XMLTEST011</Material_Id>\r
       <Title>Teszt Mozi</Title>\r
       <On_Air_Duration>00000914</On_Air_Duration>\r
+      <Material_Type>PROGRAMME</Material_Type> //PROGRAMME, COMMERCIAL, JUNCTION\r
     </Item>\r
     <Instance>\r
       <Device_Id>ISILON</Device_Id>\r
@@ -31,7 +33,52 @@ namespace Commons {
             return tc?.Replace(":", "").Replace(".", "");\r
         }\r
 \r
-        public static byte[] ToXML(string title, string fileName, string deviceID, List<MovieSegment> segments) {\r
+        public static byte[] ToXML(string title, string fileName, string deviceID, string type, List<MovieSegment> segments) {\r
+            if (String.IsNullOrEmpty(title))\r
+                throw new NullReferenceException("Hiányzik a cél állomány címe.");\r
+            if (String.IsNullOrEmpty(fileName))\r
+                throw new NullReferenceException("Hiányzik a cél állomány neve.");\r
+            if (String.IsNullOrEmpty(deviceID))\r
+                throw new NullReferenceException("Hiányzik a cél állomány eszköz leírója.");\r
+\r
+            byte[] result = null;\r
+            XmlDocument doc = new XmlDocument();\r
+            XmlElement rootElement = (XmlElement)doc.AppendChild(doc.CreateElement("ImportItems"));\r
+\r
+\r
+            Timecode duration = new Timecode();\r
+            Timecode tcIn = segments[0].TCIn;\r
+            Timecode tcOut = segments[segments.Count - 1].TCOut;\r
+            duration.Set(tcOut.Frames - tcIn.Frames);\r
+            XmlNode importItemNode = rootElement.AppendChild(doc.CreateElement("ImportItem"));\r
+            XmlElement itemElement = doc.CreateElement("Item");\r
+            importItemNode.AppendChild(itemElement);\r
+            itemElement.AppendChild(doc.CreateElement("Material_Id")).InnerText = fileName;\r
+            itemElement.AppendChild(doc.CreateElement("Title")).InnerText = title;\r
+            itemElement.AppendChild(doc.CreateElement("On_Air_Duration")).InnerText = FlattenTC(duration.ToString());\r
+            itemElement.AppendChild(doc.CreateElement("Material_Type")).InnerText = type;\r
+\r
+            XmlElement instanceElement = doc.CreateElement("Instance");\r
+            importItemNode.AppendChild(instanceElement);\r
+            instanceElement.AppendChild(doc.CreateElement("Long_File_Id")).InnerText = fileName;\r
+            instanceElement.AppendChild(doc.CreateElement("Device_Id")).InnerText = deviceID;\r
+            instanceElement.AppendChild(doc.CreateElement("Quality_Check")).InnerText = DateTime.Now.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);\r
+            instanceElement.AppendChild(doc.CreateElement("Timecode_In")).InnerText = FlattenTC(tcIn.ToString());\r
+            instanceElement.AppendChild(doc.CreateElement("Timecode_Out")).InnerText = FlattenTC(tcOut.ToString());\r
+\r
+            UTF8Encoding encoding = new UTF8Encoding(false, true);\r
+            using (MemoryStream output = new MemoryStream()) {\r
+                using (XmlTextWriter writer = new XmlTextWriter(output, encoding)) {\r
+                    writer.Formatting = Formatting.Indented;\r
+                    writer.WriteStartDocument();\r
+                    doc.Save(writer);\r
+                }\r
+                result = output.ToArray();\r
+            }\r
+            return result;\r
+        }\r
+\r
+        public static byte[] ToXMLMultiSegments(string title, string fileName, string deviceID, string type, List<MovieSegment> segments) {\r
             if (String.IsNullOrEmpty(title))\r
                 throw new NullReferenceException("Hiányzik a cél állomány címe.");\r
             if (String.IsNullOrEmpty(fileName))\r
@@ -52,6 +99,8 @@ namespace Commons {
                 itemElement.AppendChild(doc.CreateElement("Material_Id")).InnerText = fileName;\r
                 itemElement.AppendChild(doc.CreateElement("Title")).InnerText = title;\r
                 itemElement.AppendChild(doc.CreateElement("On_Air_Duration")).InnerText = FlattenTC(duration.ToString());\r
+                itemElement.AppendChild(doc.CreateElement("Material_Type")).InnerText = type;\r
+\r
                 XmlElement instanceElement = doc.CreateElement("Instance");\r
                 importItemNode.AppendChild(instanceElement);\r
                 instanceElement.AppendChild(doc.CreateElement("Long_File_Id")).InnerText = fileName;\r
@@ -77,6 +126,7 @@ namespace Commons {
             }\r
             return result;\r
         }\r
+\r
     }\r
 \r
 }
\ No newline at end of file
diff --git a/client/Maestro/Commons/WindowsIdentityMembers.cs b/client/Maestro/Commons/WindowsIdentityMembers.cs
new file mode 100644 (file)
index 0000000..097c6f0
--- /dev/null
@@ -0,0 +1,249 @@
+using Microsoft.Win32.SafeHandles;\r
+using System;\r
+using System.Diagnostics;\r
+using System.DirectoryServices.AccountManagement;\r
+using System.Runtime.ConstrainedExecution;\r
+using System.Runtime.InteropServices;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+using System.Security.Principal;\r
+\r
+namespace Maestro.Commons {\r
+\r
+    class WindowsIdentityManager {\r
+\r
+        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]\r
+        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,\r
+                int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);\r
+\r
+        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]\r
+        public extern static bool CloseHandle(IntPtr handle);\r
+\r
+        public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid {\r
+            private SafeTokenHandle()\r
+                : base(true) {\r
+            }\r
+\r
+            [DllImport("kernel32.dll")]\r
+            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]\r
+            [SuppressUnmanagedCodeSecurity]\r
+            [return: MarshalAs(UnmanagedType.Bool)]\r
+            private static extern bool CloseHandle(IntPtr handle);\r
+\r
+            protected override bool ReleaseHandle() {\r
+                return CloseHandle(handle);\r
+            }\r
+        }\r
+\r
+        [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]\r
+        public static void DoLogin(string domainName, string userName, string password) {\r
+            SafeTokenHandle safeTokenHandle;\r
+            const int LOGON32_PROVIDER_DEFAULT = 0;\r
+            const int LOGON32_PROVIDER_WINNT35 = 1;\r
+            const int LOGON32_PROVIDER_WINNT40 = 2;\r
+            const int LOGON32_PROVIDER_WINNT50 = 3;\r
+            const int LOGON32_LOGON_INTERACTIVE = 2;\r
+            const int LOGON32_LOGON_NETWORK = 3;\r
+            const int LOGON_TYPE_NEW_CREDENTIALS = 9;\r
+\r
+            // Call LogonUser to obtain a handle to an access token.\r
+            bool returnValue = LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);\r
+\r
+            if (!returnValue) {\r
+                int ret = Marshal.GetLastWin32Error();\r
+                Debug.WriteLine("LogonUser failed with error code : {0}", ret);\r
+                throw new Exception("Windows bejelentkezési hiba. Kód: " + ret);\r
+            }\r
+\r
+            using (safeTokenHandle) {\r
+                Debug.WriteLine("Before impersonation: " + WindowsIdentity.GetCurrent().Name);\r
+                // Use the token handle returned by LogonUser.\r
+                using (WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle())) {\r
+                    using (WindowsImpersonationContext impersonatedUser = newId.Impersonate()) {\r
+\r
+                        // Check the identity.\r
+                        Debug.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);\r
+                    }\r
+                }\r
+                // Releasing the context object stops the impersonation\r
+                // Check the identity.\r
+                Debug.WriteLine("After closing the context: " + WindowsIdentity.GetCurrent().Name);\r
+            }\r
+\r
+        }\r
+\r
+        static void Test(string[] args) {\r
+            // Retrieve the Windows account token for the current user.\r
+            IntPtr logonToken = LogonUser();\r
+\r
+            // Constructor implementations.\r
+            IntPtrConstructor(logonToken);\r
+            IntPtrStringConstructor(logonToken);\r
+            IntPtrStringTypeConstructor(logonToken);\r
+            IntPrtStringTypeBoolConstructor(logonToken);\r
+\r
+            // Property implementations.\r
+            UseProperties(logonToken);\r
+\r
+            // Method implementations.\r
+            GetAnonymousUser();\r
+            ImpersonateIdentity(logonToken);\r
+\r
+            Debug.WriteLine("This sample completed successfully; " +\r
+                "press Enter to exit.");\r
+            Console.ReadLine();\r
+        }\r
+\r
+        // Create a WindowsIdentity object for the user represented by the\r
+        // specified Windows account token.\r
+        private static void IntPtrConstructor(IntPtr logonToken) {\r
+            // Construct a WindowsIdentity object using the input account token.\r
+            WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken);\r
+\r
+            Debug.WriteLine("Created a Windows identity object named " +\r
+                windowsIdentity.Name + ".");\r
+        }\r
+\r
+\r
+        // Create a WindowsIdentity object for the user represented by the\r
+        // specified account token and authentication type.\r
+        private static void IntPtrStringConstructor(IntPtr logonToken) {\r
+            // Construct a WindowsIdentity object using the input account token \r
+            // and the specified authentication type.\r
+            string authenticationType = "WindowsAuthentication";\r
+            WindowsIdentity windowsIdentity =\r
+                            new WindowsIdentity(logonToken, authenticationType);\r
+\r
+            Debug.WriteLine("Created a Windows identity object named " +\r
+                windowsIdentity.Name + ".");\r
+        }\r
+\r
+        // Create a WindowsIdentity object for the user represented by the\r
+        // specified account token, authentication type, and Windows account\r
+        // type.\r
+        private static void IntPtrStringTypeConstructor(IntPtr logonToken) {\r
+            // Construct a WindowsIdentity object using the input account token,\r
+            // and the specified authentication type, and Windows account type.\r
+            string authenticationType = "WindowsAuthentication";\r
+            WindowsAccountType guestAccount = WindowsAccountType.Guest;\r
+            WindowsIdentity windowsIdentity =\r
+                new WindowsIdentity(logonToken, authenticationType, guestAccount);\r
+\r
+            Debug.WriteLine("Created a Windows identity object named " +\r
+                windowsIdentity.Name + ".");\r
+        }\r
+\r
+        // Create a WindowsIdentity object for the user represented by the\r
+        // specified account token, authentication type, Windows account type, and\r
+        // Boolean authentication flag.\r
+        private static void IntPrtStringTypeBoolConstructor(IntPtr logonToken) {\r
+            // Construct a WindowsIdentity object using the input account token,\r
+            // and the specified authentication type, Windows account type, and\r
+            // authentication flag.\r
+            string authenticationType = "WindowsAuthentication";\r
+            WindowsAccountType guestAccount = WindowsAccountType.Guest;\r
+            bool isAuthenticated = true;\r
+            WindowsIdentity windowsIdentity = new WindowsIdentity(\r
+                logonToken, authenticationType, guestAccount, isAuthenticated);\r
+\r
+            Debug.WriteLine("Created a Windows identity object named " +\r
+                windowsIdentity.Name + ".");\r
+        }\r
+        // Access the properties of a WindowsIdentity object.\r
+        private static void UseProperties(IntPtr logonToken) {\r
+            WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken);\r
+            string propertyDescription = "The Windows identity named ";\r
+\r
+            // Retrieve the Windows logon name from the Windows identity object.\r
+            propertyDescription += windowsIdentity.Name;\r
+\r
+            // Verify that the user account is not considered to be an Anonymous\r
+            // account by the system.\r
+            if (!windowsIdentity.IsAnonymous) {\r
+                propertyDescription += " is not an Anonymous account";\r
+            }\r
+\r
+            // Verify that the user account has been authenticated by Windows.\r
+            if (windowsIdentity.IsAuthenticated) {\r
+                propertyDescription += ", is authenticated";\r
+            }\r
+\r
+            // Verify that the user account is considered to be a System account\r
+            // by the system.\r
+            if (windowsIdentity.IsSystem) {\r
+                propertyDescription += ", is a System account";\r
+            }\r
+            // Verify that the user account is considered to be a Guest account\r
+            // by the system.\r
+            if (windowsIdentity.IsGuest) {\r
+                propertyDescription += ", is a Guest account";\r
+            }\r
+\r
+            // Retrieve the authentication type for the \r
+            String authenticationType = windowsIdentity.AuthenticationType;\r
+\r
+            // Append the authenication type to the output message.\r
+            if (authenticationType != null) {\r
+                propertyDescription += (" and uses " + authenticationType);\r
+                propertyDescription += (" authentication type.");\r
+            }\r
+\r
+            Debug.WriteLine(propertyDescription);\r
+\r
+            // Display the SID for the owner.\r
+            Console.Write("The SID for the owner is : ");\r
+            SecurityIdentifier si = windowsIdentity.Owner;\r
+            Debug.WriteLine(si.ToString());\r
+            // Display the SIDs for the groups the current user belongs to.\r
+            Debug.WriteLine("Display the SIDs for the groups the current user belongs to.");\r
+            IdentityReferenceCollection irc = windowsIdentity.Groups;\r
+            foreach (IdentityReference ir in irc)\r
+                Debug.WriteLine(ir.Value);\r
+            TokenImpersonationLevel token = windowsIdentity.ImpersonationLevel;\r
+            Debug.WriteLine("The impersonation level for the current user is : " + token.ToString());\r
+        }\r
+\r
+        // Retrieve the account token from the current WindowsIdentity object\r
+        // instead of calling the unmanaged LogonUser method in the advapi32.dll.\r
+        public static IntPtr LogonUser() {\r
+            IntPtr accountToken = WindowsIdentity.GetCurrent().Token;\r
+            Debug.WriteLine("Token number is: " + accountToken.ToString());\r
+            return accountToken;\r
+        }\r
+\r
+        // Get the WindowsIdentity object for an Anonymous user.\r
+        private static void GetAnonymousUser() {\r
+            // Retrieve a WindowsIdentity object that represents an anonymous\r
+            // Windows user.\r
+            WindowsIdentity windowsIdentity = WindowsIdentity.GetAnonymous();\r
+        }\r
+\r
+        // Impersonate a Windows identity.\r
+        public static WindowsImpersonationContext ImpersonateIdentity() {\r
+            IntPtr logonToken = LogonUser();\r
+            return ImpersonateIdentity(logonToken);\r
+        }\r
+\r
+        private static WindowsImpersonationContext ImpersonateIdentity(IntPtr logonToken) {\r
+            // Retrieve the Windows identity using the specified token.\r
+            WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken);\r
+\r
+            // Create a WindowsImpersonationContext object by impersonating the\r
+            // Windows identity.\r
+            WindowsImpersonationContext impersonationContext =\r
+                windowsIdentity.Impersonate();\r
+\r
+            Debug.WriteLine("Name of the identity after impersonation: " + WindowsIdentity.GetCurrent().Name + ".");\r
+            Debug.WriteLine(windowsIdentity.ImpersonationLevel);\r
+            // Stop impersonating the user.\r
+            //impersonationContext.Undo();\r
+\r
+            // Check the identity name.\r
+            //Console.Write("Name of the identity after performing an Undo on the");\r
+            //Debug.WriteLine(" impersonation: " +\r
+            //    WindowsIdentity.GetCurrent().Name);\r
+\r
+            return impersonationContext;\r
+        }\r
+    }\r
+}\r
index 53dc80c40eea27667372998c210debb7bfa39412..876ffa75ddf76667937990fb95c31f6fb34b99a5 100644 (file)
@@ -23,7 +23,7 @@ namespace Maestro.Configuration {
     }\r
 \r
     public class GlobalInfo {\r
-        public string UserDomain { get; set; }\r
+        public Connection UserDomain { get; set; }\r
     }\r
 \r
     public class ConfigurationInfo {\r
@@ -61,7 +61,7 @@ namespace Maestro.Configuration {
         public int KillDateDays { get; set; }\r
         public Connection Remote { get; set; }\r
         public bool SaveSegments { get; set; }\r
-        public bool CreateSubFolder { get; set; }\r
+        public string SubFolderFormat { get; set; }\r
         public string Tag { get; set; }\r
         public bool SaveArchiveMetadata { get; set; }\r
         public bool SaveMorpheusMetadata { get; set; }\r
index 72689711f9485311835fcacb6408b4a89e30f3f0..5324669dd6cd76f6cfd9596723ad7ed49ea1f1ef 100644 (file)
@@ -46,7 +46,7 @@
       "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
-      "createSubFolder": true,\r
+      "subFolderFormat": "%IDROOT%",\r
       "killDateDays": 7,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
@@ -61,7 +61,7 @@
       "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
-      "createSubFolder": true,\r
+      "subFolderFormat": "%IDROOT%",\r
       "killDateDays": 7,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
index 62fd3d09048ce48b05a744ae9fd4da2c2b5bd277..3ec60cf9d3ae22c69a791f6602be159e3d929616 100644 (file)
@@ -46,7 +46,7 @@
       "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
-      "createSubFolder": true,\r
+      "subFolderFormat": "%IDROOT%",\r
       "killDateDays": 7,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
@@ -61,7 +61,7 @@
       "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
-      "createSubFolder": true,\r
+      "subFolderFormat": "%IDROOT%",\r
       "killDateDays": 7,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
index 38a7a689e98e81a4116cb678d4efea9aa3a9bc8f..6834ae474c291bd0fe88c1559d934a4c63b387c3 100644 (file)
@@ -68,7 +68,7 @@
       "processor": "FXPTargetProcessor",\r
       "outputFormat": "%ID%",\r
       "tag": "Újravágás",\r
-      "createSubFolder": true,\r
+      "subFolderFormat": "%IDROOT%",\r
       "remote": {\r
         "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
         "userName": "mediacube",\r
index a3a97954fbed4b9474ed8d02d1b5be3fb8624000..ef4dea4febf95821da762d53182fb9158bbc869e 100644 (file)
@@ -1,6 +1,6 @@
 {\r
   "title": "SxS",\r
-  "active": false,\r
+  "active": true,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
   "player": {\r
@@ -12,7 +12,7 @@
     "$type": "UNCSource",\r
     "filter": "avi,wav,mxf",\r
     "local": {\r
-      "address": "file://e:/XDROOT/Clip"\r
+      "address": "file://c:/x"\r
     }\r
   },\r
   "metadatas": [\r
   "targets": [\r
     {\r
       "label": "Hír nyersanyag betöltés",\r
-      "processor": "UNCTargetProcessor",\r
+      "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
-      "createSubFolder": true,\r
+      "subFolderFormat": "%IDROOT%%TEXT%",\r
       "killDateDays": 7,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
-        "address": "file://10.10.1.100/BRAAVOS/OCTOPUS",\r
+        "address": "ftp://10.10.1.100/OCTOPUS",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
     },\r
     {\r
       "label": "Magazin nyersanyag betöltés",\r
-      "processor": "UNCTargetProcessor",\r
+      "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
-      "createSubFolder": true,\r
+      "subFolderFormat": "%IDROOT%",\r
       "killDateDays": 7,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
-        "address": "file://10.10.1.100/BRAAVOS/PLAYOUT_NLE",\r
+        "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
     },\r
     {\r
       "label": "Lebonyba küldés",\r
-      "processor": "UNCTargetProcessor",\r
+      "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%",\r
       "tag": "Lebony",\r
       "killDateDays": 7,\r
       "remote": {\r
-        "address": "file://10.10.1.100/BRAAVOS/PLAYOUT_CHECK",\r
+        "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
     },\r
     {\r
       "label": "Archiválás",\r
-      "processor": "UNCTargetProcessor",\r
+      "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%",\r
       "tag": "Archiválás",\r
       "saveArchiveMetadata": true,\r
       "remote": {\r
-        "address": "file://10.10.1.100/BRAAVOS/ARCHIVE",\r
+        "address": "ftp://10.10.1.100/ARCHIVE",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
index aa5d8afcb8e296219cc7d1d9a8490a750e5514fe..6c7a8f4d46d0dc9b55f1392d15aafe54ad095ff9 100644 (file)
@@ -1,3 +1,7 @@
 {\r
-  "userDomain": "intra.echotv.hu"\r
+  "userDomain": {\r
+    "address": "intra.echotv.hu",\r
+    "userName": "echotest",\r
+    "password": "F3QcfkSEW7hq+FcEraq9xv4UdHHeVoOh7jBH1G1k9SzEayTXyiT4WQ7XKtBO/ygnCpRU97AXoKXKoqXIGP8QlVkFurRqwzo8mywEb1q2VW7dUjkJcLFtLDkqQjM39+N9"\r
+  }\r
 }\r
diff --git a/client/Maestro/LoginForm.Designer.cs b/client/Maestro/LoginForm.Designer.cs
new file mode 100644 (file)
index 0000000..a94a714
--- /dev/null
@@ -0,0 +1,223 @@
+namespace Maestro {\r
+    partial class LoginForm {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing) {\r
+            if (disposing && (components != null)) {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent() {\r
+            this.components = new System.ComponentModel.Container();\r
+            this.pButtons = new System.Windows.Forms.FlowLayoutPanel();\r
+            this.btnOk = new System.Windows.Forms.Button();\r
+            this.btnCancel = new System.Windows.Forms.Button();\r
+            this.pLayout = new System.Windows.Forms.FlowLayoutPanel();\r
+            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\r
+            this.pictureBox1 = new System.Windows.Forms.PictureBox();\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.loginFormBindingSource = new System.Windows.Forms.BindingSource(this.components);\r
+            this.label2 = new System.Windows.Forms.Label();\r
+            this.txtUserName = new System.Windows.Forms.TextBox();\r
+            this.label3 = new System.Windows.Forms.Label();\r
+            this.txtPassword = new System.Windows.Forms.TextBox();\r
+            this.pButtons.SuspendLayout();\r
+            this.pLayout.SuspendLayout();\r
+            this.flowLayoutPanel1.SuspendLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\r
+            ((System.ComponentModel.ISupportInitialize)(this.loginFormBindingSource)).BeginInit();\r
+            this.SuspendLayout();\r
+            // \r
+            // pButtons\r
+            // \r
+            this.pButtons.Controls.Add(this.btnOk);\r
+            this.pButtons.Controls.Add(this.btnCancel);\r
+            this.pButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;\r
+            this.pButtons.Location = new System.Drawing.Point(4, 142);\r
+            this.pButtons.Margin = new System.Windows.Forms.Padding(4);\r
+            this.pButtons.Name = "pButtons";\r
+            this.pButtons.Size = new System.Drawing.Size(413, 34);\r
+            this.pButtons.TabIndex = 7;\r
+            // \r
+            // btnOk\r
+            // \r
+            this.btnOk.AutoSize = true;\r
+            this.btnOk.Dock = System.Windows.Forms.DockStyle.Left;\r
+            this.btnOk.Location = new System.Drawing.Point(299, 4);\r
+            this.btnOk.Margin = new System.Windows.Forms.Padding(4);\r
+            this.btnOk.Name = "btnOk";\r
+            this.btnOk.Size = new System.Drawing.Size(110, 27);\r
+            this.btnOk.TabIndex = 1;\r
+            this.btnOk.Text = "Bejelentkezés";\r
+            this.btnOk.UseVisualStyleBackColor = true;\r
+            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);\r
+            // \r
+            // btnCancel\r
+            // \r
+            this.btnCancel.AutoSize = true;\r
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\r
+            this.btnCancel.Dock = System.Windows.Forms.DockStyle.Right;\r
+            this.btnCancel.Location = new System.Drawing.Point(191, 4);\r
+            this.btnCancel.Margin = new System.Windows.Forms.Padding(4);\r
+            this.btnCancel.Name = "btnCancel";\r
+            this.btnCancel.Size = new System.Drawing.Size(100, 27);\r
+            this.btnCancel.TabIndex = 3;\r
+            this.btnCancel.Text = "Mégsem";\r
+            this.btnCancel.UseVisualStyleBackColor = true;\r
+            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);\r
+            // \r
+            // pLayout\r
+            // \r
+            this.pLayout.Controls.Add(this.flowLayoutPanel1);\r
+            this.pLayout.Controls.Add(this.label2);\r
+            this.pLayout.Controls.Add(this.txtUserName);\r
+            this.pLayout.Controls.Add(this.label3);\r
+            this.pLayout.Controls.Add(this.txtPassword);\r
+            this.pLayout.Controls.Add(this.pButtons);\r
+            this.pLayout.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.pLayout.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;\r
+            this.pLayout.Location = new System.Drawing.Point(0, 0);\r
+            this.pLayout.Margin = new System.Windows.Forms.Padding(4);\r
+            this.pLayout.Name = "pLayout";\r
+            this.pLayout.Size = new System.Drawing.Size(421, 182);\r
+            this.pLayout.TabIndex = 8;\r
+            this.pLayout.WrapContents = false;\r
+            // \r
+            // flowLayoutPanel1\r
+            // \r
+            this.flowLayoutPanel1.Controls.Add(this.pictureBox1);\r
+            this.flowLayoutPanel1.Controls.Add(this.label1);\r
+            this.flowLayoutPanel1.Location = new System.Drawing.Point(4, 4);\r
+            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(4);\r
+            this.flowLayoutPanel1.Name = "flowLayoutPanel1";\r
+            this.flowLayoutPanel1.Size = new System.Drawing.Size(413, 34);\r
+            this.flowLayoutPanel1.TabIndex = 8;\r
+            // \r
+            // pictureBox1\r
+            // \r
+            this.pictureBox1.Image = global::Maestro.Properties.Resources.mediacube_logo_v2_half_hard_edge;\r
+            this.pictureBox1.Location = new System.Drawing.Point(3, 3);\r
+            this.pictureBox1.Name = "pictureBox1";\r
+            this.pictureBox1.Size = new System.Drawing.Size(27, 27);\r
+            this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;\r
+            this.pictureBox1.TabIndex = 9;\r
+            this.pictureBox1.TabStop = false;\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.loginFormBindingSource, "DomainName", true));\r
+            this.label1.Location = new System.Drawing.Point(37, 0);\r
+            this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(57, 30);\r
+            this.label1.TabIndex = 0;\r
+            this.label1.Text = "Domain";\r
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\r
+            // \r
+            // loginFormBindingSource\r
+            // \r
+            this.loginFormBindingSource.DataSource = this;\r
+            this.loginFormBindingSource.Position = 0;\r
+            // \r
+            // label2\r
+            // \r
+            this.label2.AutoSize = true;\r
+            this.label2.Location = new System.Drawing.Point(4, 42);\r
+            this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(84, 17);\r
+            this.label2.TabIndex = 2;\r
+            this.label2.Text = "Felhasználó";\r
+            // \r
+            // txtUserName\r
+            // \r
+            this.txtUserName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r
+            | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.txtUserName.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.loginFormBindingSource, "UserName", true));\r
+            this.txtUserName.Location = new System.Drawing.Point(4, 63);\r
+            this.txtUserName.Margin = new System.Windows.Forms.Padding(4);\r
+            this.txtUserName.Name = "txtUserName";\r
+            this.txtUserName.Size = new System.Drawing.Size(413, 23);\r
+            this.txtUserName.TabIndex = 3;\r
+            // \r
+            // label3\r
+            // \r
+            this.label3.AutoSize = true;\r
+            this.label3.Location = new System.Drawing.Point(4, 90);\r
+            this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);\r
+            this.label3.Name = "label3";\r
+            this.label3.Size = new System.Drawing.Size(48, 17);\r
+            this.label3.TabIndex = 4;\r
+            this.label3.Text = "Jelszó";\r
+            // \r
+            // txtPassword\r
+            // \r
+            this.txtPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \r
+            | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.txtPassword.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.loginFormBindingSource, "Password", true));\r
+            this.txtPassword.Location = new System.Drawing.Point(4, 111);\r
+            this.txtPassword.Margin = new System.Windows.Forms.Padding(4);\r
+            this.txtPassword.Name = "txtPassword";\r
+            this.txtPassword.Size = new System.Drawing.Size(413, 23);\r
+            this.txtPassword.TabIndex = 5;\r
+            this.txtPassword.UseSystemPasswordChar = true;\r
+            // \r
+            // LoginForm\r
+            // \r
+            this.AcceptButton = this.btnOk;\r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.CancelButton = this.btnCancel;\r
+            this.ClientSize = new System.Drawing.Size(421, 182);\r
+            this.ControlBox = false;\r
+            this.Controls.Add(this.pLayout);\r
+            this.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;\r
+            this.Margin = new System.Windows.Forms.Padding(4);\r
+            this.Name = "LoginForm";\r
+            this.ShowIcon = false;\r
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r
+            this.Text = "Maestro bejelentkezés";\r
+            this.TopMost = true;\r
+            this.pButtons.ResumeLayout(false);\r
+            this.pButtons.PerformLayout();\r
+            this.pLayout.ResumeLayout(false);\r
+            this.pLayout.PerformLayout();\r
+            this.flowLayoutPanel1.ResumeLayout(false);\r
+            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\r
+            ((System.ComponentModel.ISupportInitialize)(this.loginFormBindingSource)).EndInit();\r
+            this.ResumeLayout(false);\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        private System.Windows.Forms.FlowLayoutPanel pButtons;\r
+        private System.Windows.Forms.Button btnOk;\r
+        private System.Windows.Forms.Button btnCancel;\r
+        private System.Windows.Forms.FlowLayoutPanel pLayout;\r
+        private System.Windows.Forms.Label label1;\r
+        private System.Windows.Forms.Label label2;\r
+        private System.Windows.Forms.TextBox txtUserName;\r
+        private System.Windows.Forms.Label label3;\r
+        private System.Windows.Forms.TextBox txtPassword;\r
+        private System.Windows.Forms.BindingSource loginFormBindingSource;\r
+        private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;\r
+        private System.Windows.Forms.PictureBox pictureBox1;\r
+    }\r
+}
\ No newline at end of file
diff --git a/client/Maestro/LoginForm.cs b/client/Maestro/LoginForm.cs
new file mode 100644 (file)
index 0000000..3591f0a
--- /dev/null
@@ -0,0 +1,24 @@
+using System;\r
+using System.Windows.Forms;\r
+\r
+namespace Maestro {\r
+    public partial class LoginForm : Form {\r
+        public string DomainName { get; set; }\r
+        public string UserName { get; set; }\r
+        public string Password { get; set; }\r
+\r
+        public LoginForm() {\r
+            InitializeComponent();\r
+        }\r
+\r
+        private void btnOk_Click(object sender, EventArgs e) {\r
+            DialogResult = DialogResult.OK;\r
+            Close();\r
+        }\r
+\r
+        private void btnCancel_Click(object sender, EventArgs e) {\r
+            DialogResult = DialogResult.Cancel;\r
+            Close();\r
+        }\r
+    }\r
+}\r
diff --git a/client/Maestro/LoginForm.resx b/client/Maestro/LoginForm.resx
new file mode 100644 (file)
index 0000000..e1a3730
--- /dev/null
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <metadata name="loginFormBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>17, 17</value>\r
+  </metadata>\r
+  <metadata name="loginFormBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>17, 17</value>\r
+  </metadata>\r
+</root>
\ No newline at end of file
index eeccd38aa8298490f1b955ccbf3e36be2ca85d1a..18a7638b61f753e43cdb290962bd66e51af17d8a 100644 (file)
     <Compile Include="Commons\ObjectExtensions.cs" />\r
     <Compile Include="Commons\SambaClient.cs" />\r
     <Compile Include="Commons\Win32File.cs" />\r
+    <Compile Include="Commons\WindowsIdentityMembers.cs" />\r
     <Compile Include="Configuration\ConfigurationInfo.cs" />\r
     <Compile Include="Configuration\KeysJsonConverter.cs" />\r
     <Compile Include="Configuration\KnownTypesBinder.cs" />\r
+    <Compile Include="LoginForm.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="LoginForm.Designer.cs">\r
+      <DependentUpon>LoginForm.cs</DependentUpon>\r
+    </Compile>\r
     <Compile Include="MaestroForm.Metadata.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
     <EmbeddedResource Include="ArchiveMetadataForm.resx">\r
       <DependentUpon>ArchiveMetadataForm.cs</DependentUpon>\r
     </EmbeddedResource>\r
+    <EmbeddedResource Include="LoginForm.resx">\r
+      <DependentUpon>LoginForm.cs</DependentUpon>\r
+    </EmbeddedResource>\r
     <EmbeddedResource Include="MaestroForm.resx">\r
       <DependentUpon>MaestroForm.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
     <None Include="packages.config" />\r
     <None Include="Properties\app.manifest" />\r
     <None Include="Properties\DataSources\ArchiveMetadataForm.datasource" />\r
+    <None Include="Properties\DataSources\LoginForm.datasource" />\r
     <None Include="Properties\DataSources\Maestro.Metadata.MetadataInfo.datasource" />\r
     <None Include="Properties\DataSources\SystemMessage.datasource" />\r
     <None Include="Properties\Settings.settings">\r
     <None Include="Resources\ic_play_arrow_black_24dp_1x.ico" />\r
     <None Include="Resources\ic_search_black_24dp_1x.png" />\r
     <None Include="Resources\ic_playlist_add_check_black_24dp_1x.png" />\r
+    <None Include="Resources\mediacube_logo_v2_half_hard_edge.png" />\r
     <Content Include="TODO.txt" />\r
   </ItemGroup>\r
   <ItemGroup>\r
index 5a320c8bd36be79d5c79b4b6567f94a0f5c42f25..0b81ad46198a71152d19b5185cc46db9a5432260 100644 (file)
@@ -95,7 +95,10 @@ namespace Maestro {
         private void OnArchiveMetadataClick(object sender, EventArgs e) {\r
             if (archiveMetadata == null)\r
                 archiveMetadata = GetArchiveMetadata();\r
-            if (archiveMetadata == null || !archiveMetadata.IsFilled) {\r
+\r
+            //if (archiveMetadata == null || !archiveMetadata.IsFilled) {\r
+            //MC metaadta esetén nincs cím\r
+            if (archiveMetadata == null) {\r
                 MessageBox.Show("Nem található archív metaadat!");\r
                 return;\r
             }\r
@@ -352,7 +355,7 @@ namespace Maestro {
             };\r
         }\r
 \r
-        private void OnTrafficIDSelected(string id, int variantID) {\r
+        private void OnTrafficIDSelected(string id, int variantID, string text) {\r
             octopusIDSelector.ClearSelection();\r
             archiveMetadata = null;\r
             if (id == null) {\r
@@ -363,6 +366,7 @@ namespace Maestro {
             SelectedMetadata = new MetadataInfo() {\r
                 Kind = metadataType,\r
                 ID = id,\r
+                MetadataText = text,\r
                 VariantID = variantID\r
             };\r
         }\r
index 553fa0b63fbf6a72358ca766220591a3f69e7a2d..b631363bacfe8197af1fb2d3249be09376f42c39 100644 (file)
@@ -224,32 +224,6 @@ namespace Maestro {
             //Cursor.Current = Cursors.Default;\r
         }\r
 \r
-        private void LookupTraffic(MetadataType metadataType) {\r
-            TrafficAPI api = trafficIDSelector.trafficAPI;\r
-            List<TrafficItem> result = null;\r
-            switch (metadataType) {\r
-                case MetadataType.TrafficMaterial:\r
-                    result = api.GetMaterials(SelectedSource?.Prefix, false);\r
-                    break;\r
-                case MetadataType.TrafficPromo:\r
-                    result = api.GetPromos(SelectedSource?.Prefix, false);\r
-                    break;\r
-                case MetadataType.TrafficAD:\r
-                    result = api.GetADs(SelectedSource?.Prefix, false);\r
-                    break;\r
-            }\r
-            if (result == null || result.Count == 0) {\r
-                MessageBox.Show(this, StringResources.NINCS_TALALAT);\r
-                return;\r
-            }\r
-            if (result.Count == 1)\r
-                OnTrafficIDSelected(result[0].MediaID, result[0].VariantID);\r
-            else {\r
-                TrafficLookupResultSelector lookupResult = new TrafficLookupResultSelector(result, OnTrafficIDSelected);\r
-                lookupResult.ShowDialog();\r
-            }\r
-        }\r
-\r
         private void picClearFilter_Click(object sender, EventArgs e) {\r
             txtSourceFilter.Text = null;\r
             bindingSource.Filter = null;\r
index e4d849e20881a227365ab6c55cf5fdf59e0d51ed..5746cdb230680e2c4fe6ead6a21c8e512405d0ed 100644 (file)
@@ -1,29 +1,24 @@
-using Commons;\r
-using LinkDotNet.MessageHandling;\r
+using LinkDotNet.MessageHandling;\r
 using LinkDotNet.MessageHandling.Contracts;\r
+using Maestro.Commons;\r
 using Maestro.Configuration;\r
 using Maestro.Properties;\r
 using NLog;\r
-using NLog.Targets;\r
 using System;\r
 using System.Collections.Concurrent;\r
 using System.Collections.Generic;\r
 using System.Diagnostics;\r
 using System.DirectoryServices.AccountManagement;\r
-using System.Drawing;\r
-using System.Globalization;\r
 using System.IO;\r
 using System.Linq;\r
 using System.Reflection;\r
 using System.Runtime.InteropServices;\r
 using System.Security.AccessControl;\r
 using System.Security.Principal;\r
-using System.Text;\r
+using System.Text.RegularExpressions;\r
 using System.Threading;\r
 using System.Threading.Tasks;\r
 using System.Windows.Forms;\r
-using System.Xml;\r
-using System.Xml.Linq;\r
 \r
 namespace Maestro {\r
 \r
@@ -74,9 +69,6 @@ namespace Maestro {
                     }\r
                 }\r
             }\r
-            //Application.EnableVisualStyles();\r
-            //Application.SetCompatibleTextRenderingDefault(false);\r
-            //Application.Run(new TrayApplicationContext());\r
         }\r
     }\r
 \r
@@ -87,36 +79,50 @@ namespace Maestro {
         private const string CONFIG_ERROR = "Nem található aktív konfiguráció.";\r
         private const string SYSCONFIG_ERROR = "Nem található a 'global.json' rendszer konfiguráció.";\r
         private const string CONFIGURATION_FOLDER = "./Configuration";\r
+        private const string DOMAIN_QUERY_ERROR = "A bejelentkezett felhasználó domain információja nem elérhető.";\r
+        private const string NOSPLASH = "nosplash";\r
+        private const string NOLOGIN = "nologin";\r
         private static Logger logger = LogManager.GetCurrentClassLogger();\r
         private NotifyIcon trayIcon;\r
         private ConcurrentBag<MeastroFormNotifyIcon> forms = new ConcurrentBag<MeastroFormNotifyIcon>();\r
         private IMessageBus messageBus = new MessageBus();\r
 \r
         public TrayApplicationContext() {\r
+            string str = Regex.Replace("Aéá.ú-óüöA", "[^0-9A-Za-z-._]", "_");\r
+            Debug.WriteLine(str);\r
         }\r
 \r
-        public void Start() {\r
+        private bool HasCommandlineParameter(string parameter) {\r
             String[] arguments = Environment.GetCommandLineArgs();\r
-            if (!arguments.ToList().Contains("nosplash")) {\r
+            return arguments.ToList().Contains(parameter);\r
+        }\r
+\r
+        public void Start() {\r
+            if (!HasCommandlineParameter(NOSPLASH)) {\r
                 Splash splash = new Splash();\r
                 Task.Run(() => {\r
                     Application.Run(splash);\r
                 });\r
             }\r
-            CreateForms();\r
+            string[] configFiles = Directory.GetFiles(CONFIGURATION_FOLDER, JSON_WILDCARD);\r
+            if (configFiles.Length == 0)\r
+                throw new Exception(CONFIG_ERROR);\r
+\r
+            CheckGlobalConfig(configFiles);\r
+            if (!HasCommandlineParameter(NOLOGIN))\r
+                CheckUser();\r
+            CreateForms(configFiles);\r
             CreateTrayIcon();\r
         }\r
 \r
-        private void CreateForms() {\r
-            string[] files = Directory.GetFiles(CONFIGURATION_FOLDER, JSON_WILDCARD);\r
-            if (files.Length == 0)\r
-                throw new Exception(CONFIG_ERROR);\r
-            \r
-            CheckGlobalConfig(files);\r
-            foreach (String file in files) {\r
+        private void CreateForms(string[] configFiles) {\r
+            foreach (String file in configFiles) {\r
                 string audioRecorderFile = Path.Combine(CONFIGURATION_FOLDER, AUDIORECORDER_JSON);\r
                 if (file.Equals(audioRecorderFile))\r
                     continue;\r
+                string globalFile = Path.Combine(CONFIGURATION_FOLDER, GLOBAL_JSON);\r
+                if (file.Equals(globalFile))\r
+                    continue;\r
                 CreateForm(file);\r
             }\r
             if (forms.Count == 0)\r
@@ -125,18 +131,60 @@ namespace Maestro {
 \r
         private void CheckGlobalConfig(string[] files) {\r
             string globalFile = Path.Combine(CONFIGURATION_FOLDER, GLOBAL_JSON);\r
-            if (files.Contains(globalFile)) {\r
-                GlobalInfo global = Loader.Get<GlobalInfo>(globalFile);\r
-                if (String.IsNullOrEmpty(global.UserDomain))\r
-                    throw new Exception(SYSCONFIG_ERROR);\r
-                else {\r
-                    //using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, global.UserDomain)) {\r
-                    //    bool isValid = pc.ValidateCredentials("echotest", "aA123456+");\r
-                    //    Debug.WriteLine("User valid: " + isValid);\r
-                    //}\r
-                }\r
-            } else\r
+            if (!files.Contains(globalFile))\r
+                throw new Exception(SYSCONFIG_ERROR);\r
+        }\r
+\r
+        private bool IsDomainUser(string userName, string domainName) {\r
+            string[] domain = userName.Split('\\');\r
+            if (domain.Length < 2)\r
+                throw new Exception(DOMAIN_QUERY_ERROR);\r
+            string userDomainName = domain[0];\r
+            if (userDomainName.Contains("."))\r
+                userDomainName = userDomainName.Split('.')[0];\r
+            if (domainName.ToLower().Equals(userDomainName.ToLower()))\r
+                return true;\r
+            return false;\r
+        }\r
+\r
+        private void CheckUser() {\r
+            string globalFile = Path.Combine(CONFIGURATION_FOLDER, GLOBAL_JSON);\r
+            GlobalInfo global = Loader.Get<GlobalInfo>(globalFile);\r
+            string domainName = global.UserDomain.Address.ToString();\r
+            if (String.IsNullOrEmpty(domainName))\r
                 throw new Exception(SYSCONFIG_ERROR);\r
+            else {\r
+                string userName = WindowsIdentity.GetCurrent().Name;\r
+                if (IsDomainUser(userName, domainName))\r
+                    return;\r
+                userName = global.UserDomain.UserName;\r
+                string password = global.UserDomain.Password;\r
+                LoginForm loginForm = null;\r
+                try {\r
+                    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domainName)) {\r
+                        while (true) {\r
+                            bool isValid = pc.ValidateCredentials(userName, password);\r
+                            if (isValid)\r
+                                break;\r
+\r
+                            if (loginForm == null)\r
+                                loginForm = new LoginForm();\r
+                            else\r
+                                MessageBox.Show("Hibás a felhasználói név, vagy hibás a jelszó.");\r
+\r
+                            DialogResult result = loginForm.ShowDialog();\r
+                            if (result == DialogResult.Cancel)\r
+                                throw new Exception("Bejelentkezés nélkül a Maestro alkalmazás nem indítható el.");\r
+                            userName = loginForm.UserName;\r
+                            password = loginForm.Password;\r
+                        }\r
+                    }\r
+                }\r
+                catch (Exception e) {\r
+                    throw new Exception("Hiba a hitelesítő adatok lekérdezésekor. A rendszer üzenete: " + e.Message);\r
+                }\r
+\r
+            }\r
         }\r
 \r
         private void CreateForm(string file) {\r
@@ -247,6 +295,7 @@ namespace Maestro {
                 trayIcon.Visible = false;\r
                 trayIcon.Dispose();\r
             }\r
+\r
         }\r
     }\r
 }\r
diff --git a/client/Maestro/Properties/DataSources/LoginForm.datasource b/client/Maestro/Properties/DataSources/LoginForm.datasource
new file mode 100644 (file)
index 0000000..583e8b6
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!--\r
+    This file is automatically generated by Visual Studio .Net. It is \r
+    used to store generic object data source configuration information.  \r
+    Renaming the file extension or editing the content of this file may   \r
+    cause the file to be unrecognizable by the program.\r
+-->\r
+<GenericObjectDataSource DisplayName="LoginForm" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">\r
+   <TypeInfo>Maestro.LoginForm, Maestro, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>\r
+</GenericObjectDataSource>
\ No newline at end of file
index 641caf4d1a785bae3982ef5d84b8541632ed4208..18be0c5e090b35d61065925844a19cfc7d45e76a 100644 (file)
@@ -100,6 +100,16 @@ namespace Maestro.Properties {
             }\r
         }\r
         \r
+        /// <summary>\r
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.\r
+        /// </summary>\r
+        internal static System.Drawing.Bitmap mediacube_logo_v2_half_hard_edge {\r
+            get {\r
+                object obj = ResourceManager.GetObject("mediacube_logo_v2_half_hard_edge", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
         /// <summary>\r
         ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).\r
         /// </summary>\r
index 3008b80908dd51a66d941561c82673573df1c8a7..e262902702e56fa74f3d9dbea433ccb9a91f4272 100644 (file)
   <data name="ic_playlist_add_check_black_24dp_1x" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
     <value>..\Resources\ic_playlist_add_check_black_24dp_1x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
   </data>\r
+  <data name="mediacube_logo_v2_half_hard_edge" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\mediacube_logo_v2_half_hard_edge.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
 </root>
\ No newline at end of file
index 899a0df4d1e0cea5565a7c405c63ed371698784e..2481849836295ff02ac0944c966b04c301c77dca 100644 (file)
Binary files a/client/Maestro/Resources/installforge-installer-project.ifp and b/client/Maestro/Resources/installforge-installer-project.ifp differ
diff --git a/client/Maestro/Resources/mediacube_logo_v2_half_hard_edge.png b/client/Maestro/Resources/mediacube_logo_v2_half_hard_edge.png
new file mode 100644 (file)
index 0000000..5135f8d
Binary files /dev/null and b/client/Maestro/Resources/mediacube_logo_v2_half_hard_edge.png differ
index 7a16fb2504c2004abe55ed81121f3614c9b2113b..f4ab6bc6728216387bba80bce1060244f88eecfc 100644 (file)
             this.components = new System.ComponentModel.Container();\r
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Splash));\r
             this.splashTimer = new System.Windows.Forms.Timer(this.components);\r
-            this.pictureBox1 = new System.Windows.Forms.PictureBox();\r
+            this.picWorld = new System.Windows.Forms.PictureBox();\r
             this.labelVersion = new System.Windows.Forms.Label();\r
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            ((System.ComponentModel.ISupportInitialize)(this.picWorld)).BeginInit();\r
             this.SuspendLayout();\r
             // \r
             // splashTimer\r
             this.splashTimer.Interval = 2000;\r
             this.splashTimer.Tick += new System.EventHandler(this.splashTimer_Tick);\r
             // \r
-            // pictureBox1\r
+            // picWorld\r
             // \r
-            this.pictureBox1.BackColor = System.Drawing.Color.Transparent;\r
-            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));\r
-            this.pictureBox1.Location = new System.Drawing.Point(16, 0);\r
-            this.pictureBox1.Name = "pictureBox1";\r
-            this.pictureBox1.Size = new System.Drawing.Size(320, 349);\r
-            this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r
-            this.pictureBox1.TabIndex = 0;\r
-            this.pictureBox1.TabStop = false;\r
+            this.picWorld.BackColor = System.Drawing.Color.Transparent;\r
+            this.picWorld.Image = ((System.Drawing.Image)(resources.GetObject("picWorld.Image")));\r
+            this.picWorld.Location = new System.Drawing.Point(16, 0);\r
+            this.picWorld.Name = "picWorld";\r
+            this.picWorld.Size = new System.Drawing.Size(320, 349);\r
+            this.picWorld.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;\r
+            this.picWorld.TabIndex = 0;\r
+            this.picWorld.TabStop = false;\r
             // \r
             // labelVersion\r
             // \r
             this.labelVersion.BackColor = System.Drawing.Color.Transparent;\r
-            this.labelVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
-            this.labelVersion.ForeColor = System.Drawing.Color.LightGray;\r
-            this.labelVersion.Location = new System.Drawing.Point(16, 281);\r
+            this.labelVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
+            this.labelVersion.ForeColor = System.Drawing.Color.White;\r
+            this.labelVersion.Location = new System.Drawing.Point(16, 295);\r
             this.labelVersion.Name = "labelVersion";\r
             this.labelVersion.Size = new System.Drawing.Size(317, 23);\r
             this.labelVersion.TabIndex = 1;\r
-            this.labelVersion.Text = "label1";\r
+            this.labelVersion.Text = "0.0.0";\r
             this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\r
             // \r
+            // label1\r
+            // \r
+            this.label1.BackColor = System.Drawing.Color.Transparent;\r
+            this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
+            this.label1.ForeColor = System.Drawing.Color.White;\r
+            this.label1.Location = new System.Drawing.Point(17, 277);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(317, 23);\r
+            this.label1.TabIndex = 2;\r
+            this.label1.Text = "Maestro";\r
+            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;\r
+            // \r
             // Splash\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
-            this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));\r
+            this.BackgroundImage = global::Maestro.Properties.Resources.mediacube_logo_v2_half_hard_edge;\r
             this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\r
-            this.ClientSize = new System.Drawing.Size(348, 361);\r
+            this.ClientSize = new System.Drawing.Size(350, 361);\r
+            this.Controls.Add(this.label1);\r
             this.Controls.Add(this.labelVersion);\r
-            this.Controls.Add(this.pictureBox1);\r
+            this.Controls.Add(this.picWorld);\r
             this.DoubleBuffered = true;\r
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;\r
             this.Name = "Splash";\r
@@ -76,7 +90,7 @@
             this.Text = "Splash";\r
             this.TopMost = true;\r
             this.TransparencyKey = System.Drawing.SystemColors.Control;\r
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\r
+            ((System.ComponentModel.ISupportInitialize)(this.picWorld)).EndInit();\r
             this.ResumeLayout(false);\r
 \r
         }\r
@@ -84,7 +98,8 @@
         #endregion\r
 \r
         private System.Windows.Forms.Timer splashTimer;\r
-        private System.Windows.Forms.PictureBox pictureBox1;\r
+        private System.Windows.Forms.PictureBox picWorld;\r
         private System.Windows.Forms.Label labelVersion;\r
+        private System.Windows.Forms.Label label1;\r
     }\r
 }
\ No newline at end of file
index 86f5c44408abf9ab71f9ce332e6afa97b8380aa1..df785bd1cb06b0e547cd5ef1ec05a87555e8575b 100644 (file)
@@ -1,23 +1,12 @@
 using System;\r
-using System.Collections.Generic;\r
-using System.ComponentModel;\r
-using System.Data;\r
-using System.Diagnostics;\r
 using System.Drawing;\r
-using System.Linq;\r
 using System.Reflection;\r
-using System.Text;\r
-using System.Threading.Tasks;\r
 using System.Windows.Forms;\r
 \r
 namespace Maestro {\r
     public partial class Splash : Form {\r
         public Splash() {\r
             InitializeComponent();\r
-            //Assembly assembly = Assembly.GetExecutingAssembly();\r
-            //FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);\r
-            //labelVersion.Text = fvi.FileVersion;\r
-\r
             Version version = Assembly.GetEntryAssembly().GetName().Version;\r
             labelVersion.ForeColor = Color.White;\r
             labelVersion.Text = String.Format("v{0}.{1}.{2}", version.Major, version.Minor, version.Build);\r
@@ -25,7 +14,6 @@ namespace Maestro {
 \r
         private void splashTimer_Tick(object sender, EventArgs e) {\r
             BeginInvoke(new Action(() => Close()));\r
-            //Close();    \r
         }\r
 \r
     }\r
index 302e5997560c6a10cb0f5afc3773fcb2f703519d..c4eb18678f0b97a096144f7b5ac804da3274b8e5 100644 (file)
     <value>17, 17</value>\r
   </metadata>\r
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
-  <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+  <data name="picWorld.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
     <value>\r
         R0lGODlhWAJ0ATAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQNFAAAACH5BA0UAAAALAAAAABYAnQBgf//\r
         //DkQla06QAAAAL+hI+py93hYoSy2oubEIvmD4bieHjkqWwqyjpmC8fA20KrjOcMzfL6z+AofMCicXj8\r
         RyPT6nCvEH38MUjzmixSgiOnLEbKF1ds0r/qsExNyysnHMIcMGfsUkuGnjTxRDLPSmJMGpk8EwUg4xTs\r
         yxSpZA/FJXuUs01T2AQOxkCxcdNKOFsgNL00+RyUwzyTaUTRQcqY9EYuv8jQUU4gVXLEmgRi1M8qARFV\r
         00FCC+wjRgM8ldHLTHkpAAAh/g5hdXRvbWF0dGljX2luYwA7\r
-</value>\r
-  </data>\r
-  <data name="$this.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        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\r
 </value>\r
   </data>\r
 </root>
\ No newline at end of file
index b452ddefa36e0753db30670e2827b62ec198e883..5ff420f05e4bf9e31680913501a1b2b24d7f1313 100644 (file)
@@ -3,10 +3,9 @@ using Maestro.Configuration;
 using NLog;\r
 using System;\r
 using System.IO;\r
+using System.Linq;\r
 using System.Net;\r
 using System.Windows.Forms;\r
-using Model;\r
-using System.Threading;\r
 \r
 namespace Maestro.Targets {\r
 \r
@@ -124,6 +123,25 @@ namespace Maestro.Targets {
             return result;\r
         }\r
 \r
+        protected override string DetermineWorkingDirectory(Connection connection) {\r
+            string result = null;\r
+            if (!String.IsNullOrEmpty(parameters.TargetConfig.SubFolderFormat)) {\r
+                string name = GetDynamicName(parameters.TargetConfig.SubFolderFormat);\r
+                //TODO ellenőrizni, hogy mi van placeholder esetén\r
+                if (parameters.TargetConfig.SubFolderFormat.Contains("%TEXT%")) {\r
+                    string pattern = name.Split('-')[0] + "-";\r
+                    targetFTP.SetWorkingDirectory(connection.Address.LocalPath);\r
+                    FtpListItem item = targetFTP.GetListing()?.Where(i => i.Type.Equals(FtpFileSystemObjectType.Directory) && i.Name.StartsWith(pattern)).FirstOrDefault();\r
+                    if (item != null)\r
+                        name = item.Name;\r
+                    targetFTP.SetWorkingDirectory("/");\r
+                }\r
+                result = Path.Combine(connection.Address.LocalPath, name);\r
+            } else\r
+                result = connection.Address.LocalPath;\r
+            return result;\r
+        }\r
+\r
         protected void TerminateClient(FtpClient ftpClient) {\r
             if (ftpClient != null) {\r
                 ftpClient.Disconnect();\r
index 2b48519d33c961be5269980a1b35e3788f55105d..f908c73b77fc59da366d51b7fcdcac4459455e97 100644 (file)
@@ -10,6 +10,7 @@ using Maestro.Commons;
 using Commons;\r
 using Maestro.Metadata;\r
 using System.Globalization;\r
+using System.Text.RegularExpressions;\r
 \r
 namespace Maestro.Targets {\r
 \r
@@ -25,6 +26,9 @@ namespace Maestro.Targets {
         private const string KILLDATE_FILE = "{0}.{1}.killdate";\r
         private const string METADATA_FILE = "{0}.json";\r
         private const string DEFAULT_EXTENSION = ".MXF";\r
+        private const string NORMALIZE_TEXT_PATTERN = "[^0-9A-Za-z-._]";\r
+        private const string NORMALIZE_TEXT_REPLACEMENT = "_";\r
+\r
         protected FileInfo inputFile;\r
         protected string workingDir;\r
         protected TargetProcessorParameter parameters;\r
@@ -140,7 +144,19 @@ namespace Maestro.Targets {
             string title = parameters.ArchiveMetadata?.itemTitle;\r
             if (!title.Equals(parameters.ArchiveMetadata?.mediaTitle))\r
                 title += " - " + parameters.ArchiveMetadata?.mediaTitle;\r
-            byte[] content = MorpheusXML.ToXML(title, name, parameters.TargetConfig.DeviceIDMorpheus, parameters.MovieSegments);\r
+            string type = null;\r
+            switch (parameters.MetadataKind) {\r
+                case MetadataType.TrafficMaterial:\r
+                    type = "PROGRAMME";\r
+                    break;\r
+                case MetadataType.TrafficPromo:\r
+                    type = "COMMERCIAL";\r
+                    break;\r
+                case MetadataType.TrafficAD:\r
+                    type = "JUNCTION";\r
+                    break;\r
+            }\r
+            byte[] content = MorpheusXML.ToXML(title, name, parameters.TargetConfig.DeviceIDMorpheus, type, parameters.MovieSegments);\r
             EnsureDirectoryExistence(parameters.TargetConfig.PathMorpheusMetadata);\r
             UploadContent(name + ".xml", content);\r
         }\r
@@ -175,13 +191,17 @@ namespace Maestro.Targets {
             }\r
         }\r
 \r
-        protected String DetermineWorkingDirectory(Connection connection) {\r
+        protected virtual string DetermineWorkingDirectory(Connection connection) {\r
             string result = null;\r
-            if (parameters.TargetConfig.CreateSubFolder) {\r
-                string subDir = ID;\r
-                if (ID.Contains("_"))\r
-                    subDir = ID.Split('_')[0];\r
-                result = Path.Combine(connection.Address.LocalPath, ID);\r
+            if (!String.IsNullOrEmpty(parameters.TargetConfig.SubFolderFormat)) {\r
+                string name = GetDynamicName(parameters.TargetConfig.SubFolderFormat);\r
+                if (parameters.TargetConfig.SubFolderFormat.Contains("%TEXT%")) {\r
+                    string pattern = name.Split('-')[0] + "-*";\r
+                    string[] dirs = Directory.GetDirectories(connection.Address.LocalPath, pattern);\r
+                    if (dirs.Length > 0)\r
+                        name = dirs[0];\r
+                }\r
+                result = Path.Combine(connection.Address.LocalPath, name);\r
             } else\r
                 result = connection.Address.LocalPath;\r
             return result;\r
@@ -257,12 +277,36 @@ namespace Maestro.Targets {
             return "/".Equals(workingDir) ? fileName : Path.Combine(path, fileName);\r
         }\r
 \r
-        protected virtual string CreateOutputFileName() {\r
-            string nameWithoutExtension = parameters.TargetConfig.OutputFormat\r
+        public static String RemoveDiacritics(String s) {\r
+            String normalizedString = s.Normalize(NormalizationForm.FormD);\r
+            StringBuilder stringBuilder = new StringBuilder();\r
+\r
+            for (int i = 0; i < normalizedString.Length; i++) {\r
+                Char c = normalizedString[i];\r
+                if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)\r
+                    stringBuilder.Append(c);\r
+            }\r
+\r
+            return stringBuilder.ToString();\r
+        }\r
+\r
+        protected string GetDynamicName(string text) {\r
+            string idRoot = ID.Contains(NORMALIZE_TEXT_REPLACEMENT) ? ID.Split(NORMALIZE_TEXT_REPLACEMENT[0])[0] : ID;\r
+            string result = text\r
                 .Replace("%ID%", ID)\r
-                .Replace("%TEXT%", parameters.MetadataText)\r
+                .Replace("%IDROOT%", idRoot)\r
+                .Replace("%TEXT%", "-" + RemoveDiacritics(parameters.MetadataText))\r
                 .Replace("%SOURCENAME%", Path.GetFileNameWithoutExtension(InputName))\r
                 .Replace("%TIMESTAMP%", DateTime.Now.ToString("yyyyMMddhhmmss", CultureInfo.InvariantCulture));\r
+            // replace hungarian and special characters\r
+            result = Regex.Replace(result, NORMALIZE_TEXT_PATTERN, NORMALIZE_TEXT_REPLACEMENT);\r
+            if (result.Length > 100)\r
+                result = result.Substring(0, 100);\r
+            return result;\r
+        }\r
+\r
+        protected virtual string CreateOutputFileName() {\r
+            string nameWithoutExtension = GetDynamicName(parameters.TargetConfig.OutputFormat);\r
             string extension = InputName.Contains(".") ? InputName.Substring(InputName.LastIndexOf(".")) : DEFAULT_EXTENSION;\r
             extension = extension.ToUpper();\r
             string result = String.Format(FILENAME, nameWithoutExtension, extension);\r
index e975ab2e4f5a6240bef5f7a4c884b05b425ab820..2a07b2e1230064d8ffd7d64b57e736d4fe6cf22c 100644 (file)
@@ -126,7 +126,8 @@ namespace OctopusClient {
                     label += String.Format($" {story.Name}");\r
 \r
                 TreeNode storyNode = treeOctopus.Nodes.Add(ID, label);\r
-                storyNode.Tag = ID;\r
+                storyNode.Tag = story;\r
+\r
                 if (configuration.DisableStoryCheck)\r
                     HideCheckBox(treeOctopus, storyNode);\r
                 else {\r
@@ -177,9 +178,11 @@ namespace OctopusClient {
                 treeOctopus.SelectedNode = selectedNode;\r
             }\r
 \r
-            if (selectedNode.Checked)\r
-                IDChangedEvent?.Invoke(selectedNode.Tag as string, selectedNode.Name, selectedNode.Text);\r
-            else\r
+            if (selectedNode.Checked) {\r
+                Story story = selectedNode.Tag as Story;\r
+                string text = String.Format($"{story.Name}_{story.Format}");\r
+                IDChangedEvent?.Invoke(story.ParentStoryID, selectedNode.Name, text);\r
+            }  else\r
                 IDChangedEvent?.Invoke(null, null, null);\r
         }\r
 \r
@@ -187,7 +190,6 @@ namespace OctopusClient {
             return client;\r
         }\r
 \r
-\r
         /// <summary>\r
         /// Hides the checkbox for the specified node on a TreeView control.\r
         /// </summary>\r
index 169c0fbccdceb4f2f43814e479fb40ae181498ec..2b1d005db8dba7934a7704c64a19630aa47453e1 100644 (file)
@@ -6,7 +6,7 @@ using LinkDotNet.MessageHandling.Contracts;
 using System.Drawing;\r
 \r
 namespace TrafficClient {\r
-    public delegate void OnSelectedIDChanged(string ID, int variantID);\r
+    public delegate void OnSelectedIDChanged(string ID, int variantID, string text);\r
 \r
     public partial class TrafficIDSelector : UserControl {\r
         public TrafficAPI trafficAPI { get; private set; }\r
@@ -81,14 +81,14 @@ namespace TrafficClient {
         }\r
 \r
         private void OnSelectionChanged(DataGridViewRow actualRow) {\r
-            TrafficItem res = actualRow.DataBoundItem as TrafficItem;\r
-            if (String.IsNullOrEmpty(res.MediaID)) {\r
-                TrafficVersion v = trafficAPI.CreateMaterialVersion(res.EpisodeID);\r
+            TrafficItem trafficItem = actualRow.DataBoundItem as TrafficItem;\r
+            if (String.IsNullOrEmpty(trafficItem.MediaID)) {\r
+                TrafficVersion v = trafficAPI.CreateMaterialVersion(trafficItem.EpisodeID);\r
                 if (v != null) {\r
-                    res.MediaID = v.MediaID;\r
-                    res.VariantID = v.VariantID;\r
+                    trafficItem.MediaID = v.MediaID;\r
+                    trafficItem.VariantID = v.VariantID;\r
                 }\r
-                if (res.VariantID == 0 || String.IsNullOrEmpty(res.MediaID))\r
+                if (trafficItem.VariantID == 0 || String.IsNullOrEmpty(trafficItem.MediaID))\r
                     return;\r
             }\r
             DataGridViewCheckBoxCell actualCell = actualRow.Cells[0] as DataGridViewCheckBoxCell;\r
@@ -99,10 +99,10 @@ namespace TrafficClient {
             selectedCell.Value = !(bool)selectedCell.Value;\r
             bool selected = (bool)selectedCell.Value;\r
             Debug.WriteLine("Selection {0}", selected);\r
-            if (selected) {\r
-                IDChangedEvent?.Invoke(res.MediaID, res.VariantID);\r
-            else\r
-                IDChangedEvent?.Invoke(null, 0);\r
+            if (selected)\r
+                IDChangedEvent?.Invoke(trafficItem.MediaID, trafficItem.VariantID, trafficItem.Title);\r
+            else\r
+                IDChangedEvent?.Invoke(null, 0, null);\r
         }\r
 \r
         public void ClearSelection() {\r
@@ -122,6 +122,7 @@ namespace TrafficClient {
         }\r
 \r
         private void OnTypeFilterChanged(object sender, EventArgs e) {\r
+            dtScheduled.Enabled = rbMaterial.Checked;\r
             RefreshResults();\r
         }\r
 \r
index cdd39f705df9c07c547749101a4aefe34cef1112..0a0a0ded811e83be51378f3ee776252c16e9418f 100644 (file)
@@ -1,3 +1,3 @@
 SErvername       MEDIACUBE\r
-*traceflags api\r
-*tracefile /opt/mediacube/tsm.trace
\ No newline at end of file
+traceflags api\r
+tracefile /opt/mediacube/log/tsm.trace
\ No newline at end of file
index 63f6235b6e3005978cb85b2ae069338ba07d207b..2ea650ba9b7af6930c2c6da2ee241ea5f7f20de1 100644 (file)
@@ -19,7 +19,7 @@
                        <Filters>\r
                                <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
                        </Filters>\r
-                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L) %n" />\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n" />\r
                </Console>\r
                <HTMLMailAppender name="MarkeredMail" subject="MediaCube rendszerüzenet" to="vasary@elgekko.net" from="mediacubeserver@gmail.com" smtpHost="smtp.gmail.com"\r
                        smtpPort="465" smtpProtocol="smtps" smtpUsername="mediacubeserver@gmail.com" smtpPassword="salabakter" ignoreExceptions="false" bufferSize="1">\r
@@ -32,7 +32,7 @@
                        <Filters>\r
                                <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
                        </Filters>\r
-                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg%n %throwable" />\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n %throwable" />\r
                        <Policies>\r
                                <TimeBasedTriggeringPolicy />\r
                        </Policies>\r
                        <Filters>\r
                                <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
                        </Filters>\r
-                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M %msg%n %throwable" />\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
                        <Policies>\r
                                <TimeBasedTriggeringPolicy />\r
                        </Policies>\r
                </RollingFile>\r
                <RollingFile name="RollingFileExceptions" fileName="${fileName.err}" filePattern="${filePattern.err}">\r
-                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg%n %throwable" />\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n %throwable" />\r
                        <Filters>\r
                                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />\r
                        </Filters>\r
index 5dc889b3be5a6ea09bb138bb6463054813d2a65e..da453c87aad10e33b5a9acf7d3ea79c87685d464 100644 (file)
@@ -9,43 +9,45 @@
    <launcherArgs>\r
       <programArgs>-consoleLog -console 5555\r
       </programArgs>\r
-      <vmArgs>-Dfile.encoding=UTF-8
--agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888
--Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory
-
-#System
--Djetty.home=/opt/mediacube/configuration/jetty
--Dlog4j.configurationFile=/opt/mediacube/configuration/log4j2.xml
--Djobengine.jobsteps.root=/opt/mediacube/configuration/executors
--Djobengine.jobtemplates.root=/opt/mediacube/configuration/jobtemplates
--Djobengine.jobscheduling.config=/opt/mediacube/configuration/scheduledjobs.json
-
--Dorg.eclipse.equinox.http.jetty.http.port=80
--Dorg.eclipse.epp.logging.aeri.skipReports=true 
--Declipse.ignoreApp=true 
--Dosgi.noShutdown=true
--Djobengine.loglevel=INFO
--Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,etc/user-jetty-http.xml,etc/user-jetty-https.xml\r
-      </vmArgs>\r
-      <vmArgsLin>#Database\r
--Djobengine.db.url=jdbc:db2://localhost:50000/mc:retrieveMessagesFromServerOnGetMessage=true;\r
--Djobengine.db.user=db2admin\r
--Djobengine.db.password=password\r
--Djobengine.nosql.db.url=jdbc:db2://localhost:50000/mc:retrieveMessagesFromServerOnGetMessage=true;\r
--Djobengine.nosql.db.user=db2admin\r
--Djobengine.nosql.db.password=password\r
--Djobengine.nosql.db.schema=test\r
-\r
-#Octopus\r
--Djobengine.octopus.api.address=http://10.10.1.11/api/v1\r
--Djobengine.octopus.api.user=mam\r
--Djobengine.octopus.api.password=napocska\r
+      <vmArgs>-Xms512m\r
+-Xmx1024m\r
+-Dfile.encoding=UTF-8\r
+-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888\r
+-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory\r
 \r
-#Selenio\r
--Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl\r
--Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v4.zenium\r
+#System\r
+-Djetty.home=/opt/mediacube/configuration/jetty\r
+-Dlog4j.configurationFile=/opt/mediacube/configuration/log4j2.xml\r
+-Djobengine.jobsteps.root=/opt/mediacube/configuration/executors\r
+-Djobengine.jobtemplates.root=/opt/mediacube/configuration/jobtemplates\r
+-Djobengine.jobscheduling.config=/opt/mediacube/configuration/scheduledjobs.json\r
 \r
-#Nexio\r
+-Dorg.eclipse.equinox.http.jetty.http.port=80\r
+-Dorg.eclipse.epp.logging.aeri.skipReports=true \r
+-Declipse.ignoreApp=true \r
+-Dosgi.noShutdown=true\r
+-Djobengine.loglevel=INFO\r
+-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,etc/user-jetty-http.xml,etc/user-jetty-https.xml\r
+      </vmArgs>\r
+      <vmArgsLin>#Database
+-Djobengine.db.url=jdbc:db2://localhost:50000/mc:retrieveMessagesFromServerOnGetMessage=true;
+-Djobengine.db.user=db2admin
+-Djobengine.db.password=password
+-Djobengine.nosql.db.url=jdbc:db2://localhost:50000/mc:retrieveMessagesFromServerOnGetMessage=true;
+-Djobengine.nosql.db.user=db2admin
+-Djobengine.nosql.db.password=password
+-Djobengine.nosql.db.schema=test
+
+#Octopus
+-Djobengine.octopus.api.address=http://10.10.1.11/api/v1
+-Djobengine.octopus.api.user=mam
+-Djobengine.octopus.api.password=napocska
+
+#Selenio
+-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl
+-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v4.zenium
+
+#Nexio
 -Dnexio.host=10.10.1.55\r
       </vmArgsLin>\r
       <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts\r
index 8e7050e8fc09a5741d8e7f681686e7250efa217a..f02b54d071f57afbfa3e6d9abe783be1e25ca7a7 100644 (file)
                                                                <argument>/command</argument>\r
                                                                <argument>"open ${remote.address} -hostkey=""${remote.hostkey}"""</argument>\r
 <!--                                                           <argument>"call ${remote.location}/stop-mediacube.sh 2>/dev/null"</argument> -->\r
-                                                               <argument>"call pcs resource disable mediacube_script"</argument>\r
-                                                               <argument>"call sleep 5"</argument>\r
+<!--                                                           <argument>"call pcs resource disable mediacube_script"</argument> -->\r
+<!--                                                           <argument>"call sleep 5"</argument> -->\r
                                                                <argument>"call rm -rf ${remote.location}"</argument>\r
                                                                <argument>"call mkdir ${remote.location}"</argument>\r
                                                                <argument>"lcd ${local.location}"</argument>\r
index 1ff54b9694e39ec9d487b821b179b97eee0836f6..9271e46bd47f0f91385d5a60a33cd96167eda3f0 100644 (file)
@@ -60,7 +60,7 @@ public class TSMBackupStep extends JobStep {
 \r
                        if (killDateDays > 0) {\r
                                KillDateFile killDateFile = new KillDateFile(sourceMediaFile.getParent().toString(), sourceMediaFile.getFileName().toString());\r
-                               killDateFile.create(killDateDays);\r
+                               killDateFile.create(killDateDays, getMarker());\r
                        }\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
index 48fbcf8c9e9b12a26aa61545d1281ddef8b3c6f8..e41cbe62de5acc5b124bf2ea59ec90d83abadd72 100644 (file)
@@ -58,7 +58,7 @@ public class TSMRestoreStep extends JobStep {
 \r
                        if (killDateDays > 0) {\r
                                KillDateFile killDateFile = new KillDateFile(targetPath, targetFileName);\r
-                               killDateFile.create(killDateDays);\r
+                               killDateFile.create(killDateDays, getMarker());\r
                        }\r
 \r
                } catch (Exception e) {\r
index 0659150de5b3cf8681d149181a5d6cb079642285..4624113b5a1dadfaafde16e51d33c666e835c00e 100644 (file)
@@ -152,9 +152,9 @@ public class TranscodeSELENIOStep extends JobStep {
                        if (transcodeTask == null)\r
                                throw new NullPointerException("Unable to query transcode task, server response is empty for transcode input: " + sourceFile);\r
 \r
-                       Integer estimate = transcodeTask.getEstimateSecondsRemaining();\r
-                       if (estimate != null)\r
-                               logger.info("Estimate {}", estimate);\r
+                       //                      Integer estimate = transcodeTask.getEstimateSecondsRemaining();\r
+                       //                      if (estimate != null)\r
+                       //                              logger.info("Estimate {}", estimate);\r
                        Double progress = transcodeTask.getProgress();\r
                        if (progress != null)\r
                                jobRuntime.incrementProgress((int) Math.round(progress * 100));\r
index 2b57a447b9a53ae131a179ded88a99343eac01f7..daa69089b35bd9afd9b71e634608ae5998c9888d 100644 (file)
@@ -116,7 +116,7 @@ public class OctopusAPI implements IOctopusAPI {
                                        QueryBuilder.start("scheduledStart").lessThan(calStop.getTime()).get()).get();\r
                }\r
 \r
-               logger.info(query);\r
+               //logger.info(query);\r
                DBCursor find = collection.find(query).sort(new BasicDBObject("scheduledStart", new BasicDBList(1, "$date")));\r
                if (find.hasNext())\r
                        result = find.toArray();\r
index d12647dee08f4c6141b516b943030cd31fdb4a36..b60264e1dd97d8685ce4acd66514dc5f48880835 100644 (file)
@@ -53,7 +53,7 @@ public class ItemDAOEx {
                        qf.format("(SELECT ii.ID %1$s) ORDER BY i.TITLE", innerQuery);\r
                }\r
 \r
-               logger.info(resultQuery.toString());\r
+               logger.trace(resultQuery.toString());\r
                return resultQuery.toString();\r
        }\r
 \r
@@ -65,7 +65,7 @@ public class ItemDAOEx {
                else\r
                        typeQuery = String.format("SELECT ii.ITEMTYPEID, CAST(COUNT(DISTINCT(ii.ID)) AS BIGINT) %s GROUP BY ii.ITEMTYPEID", innerQuery);\r
 \r
-               logger.info(typeQuery.toString());\r
+               logger.trace(typeQuery.toString());\r
                PreparedStatement st = null;\r
                ResultSet rs = null;\r
                try {\r
@@ -85,7 +85,7 @@ public class ItemDAOEx {
                                results.add(sr);\r
                        }\r
                } catch (Exception e) {\r
-                       e.printStackTrace();\r
+                       logger.catching(e);\r
                } finally {\r
                        try {\r
                                if (rs != null)\r
index 7ecf7cbbf98682314a1259e2af830c7fe898cee2..770202e02892e5f38f26fdb2f008cb0301bb9870 100644 (file)
@@ -38,8 +38,7 @@ public class JobStepExecutor implements IJobStepExecutor {
                                                step = createStepObject();
                                                if (step == null)
                                                        throw new Exception("Step object is null");
-                                               logger.info("Executing job {}-{}, step {}, thread name {}", jobRuntime.getId(), jobRuntime.getName(), step.getClass().getSimpleName(),
-                                                               getName());
+                                               logger.info("Executing job {}-{}, step {} ({})", jobRuntime.getId(), jobRuntime.getName(), step.getClass().getSimpleName(), getName());
                                                //TODO ez biztosan kell?
                                                //jobRuntime.IncrementPriority();
 
@@ -50,7 +49,7 @@ public class JobStepExecutor implements IJobStepExecutor {
                                                jobEngine.sendMessage(new JobStepCompletedMessage(jobRuntime.getId(), outputs));
                                        }
                                } catch (Exception e) {
-                                       logger.error("Error executing job {}-{}, thread name {}", jobRuntime.getId(), jobRuntime.getName(), getName());
+                                       logger.error("Error executing job {}-{} ({})", jobRuntime.getId(), jobRuntime.getName(), getName());
                                        Throwable t = e.getCause() == null ? e : e.getCause();
                                        logger.catching(t);
                                        jobEngine.suspendJob(t, jobRuntime);
@@ -206,7 +205,7 @@ public class JobStepExecutor implements IJobStepExecutor {
        public void submit(IJobRuntime jobRuntime) {
                queue.put(jobRuntime);
                jobRuntime.setDescription(stepClass.getSimpleName());
-               logger.info("Executor got ! {}", jobRuntime);
+               //logger.info("Executor got ! {}", jobRuntime);
        }
 
 }
index ae95f199160ee457f243554bae377cc9c151a359..76d46eba43aaf672283e016aa0fc1bfea0e3a2ab 100644 (file)
@@ -12,7 +12,12 @@ import java.text.SimpleDateFormat;
 import java.util.Calendar;\r
 import java.util.Set;\r
 \r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
 public class KillDateFile {\r
+       private static final Logger logger = LogManager.getLogger();\r
        private static final String KILLDATE_NAME = "%s.%s.killdate";\r
        private static final String YYYY_M_MDD = "yyyyMMdd";\r
        private static final String STATUSFOLDER = ".STATUS";\r
@@ -24,7 +29,7 @@ public class KillDateFile {
                this.fileName = fileName;\r
        }\r
 \r
-       public void create(int days) throws IOException {\r
+       public void create(int days, Marker marker) throws IOException {\r
                Path statusPath = Paths.get(filePath, STATUSFOLDER);\r
                File statusFolder = statusPath.toFile();\r
                if (!statusFolder.exists() || !statusFolder.isDirectory()) {\r
@@ -37,6 +42,9 @@ public class KillDateFile {
                SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_M_MDD);\r
                String killDateFileName = String.format(KILLDATE_NAME, fileName, dateFormat.format(killDate.getTime()));\r
                Path killDatePath = Paths.get(filePath, STATUSFOLDER, killDateFileName);\r
-               Files.createFile(killDatePath);\r
+               if (Files.exists(killDatePath))\r
+                       logger.warn(marker, "Az '{}' állomány már létezik.", killDatePath);\r
+               else\r
+                       Files.createFile(killDatePath);\r
        }\r
 }\r
index 3935a0f30d3bd83b463f634bdcf7f3315bc3f713..c2a9811311eaa69ccb2be5a5e601eb06f9dfbbe3 100644 (file)
@@ -28,7 +28,7 @@ public class JobengineService {
        private IItemManager itemManager = ComponentBinder.getItemManagerService();\r
 \r
        public JobengineService() {\r
-               logger.info("Created");\r
+               //logger.info("Created");\r
        }\r
 \r
        @POST\r
index d9bd0f46536b51d28d693db3cf5dfc72f062cfa2..931b99eee88f80f91146710c47ea295d9f3bc9f1 100644 (file)
@@ -5,3 +5,4 @@ Bundle-SymbolicName: user.tsm.client;singleton:=true
 Bundle-Version: 1.2.0
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Export-Package: user.tsm.client
+Import-Package: org.apache.logging.log4j
index fb4c356c161e2b1920b509c709303aaee703184b..c554ddc9588613e0cf0b6cd841d5b0972242e309 100644 (file)
@@ -3,6 +3,9 @@ package user.tsm.client;
 import java.io.FileNotFoundException;\r
 import java.io.IOException;\r
 \r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
 import user.tsm.client.api.internal.DataBlk;\r
 import user.tsm.client.api.internal.DsmEndTxnExIn;\r
 import user.tsm.client.api.internal.DsmEndTxnExOut;\r
@@ -16,7 +19,7 @@ import user.tsm.client.api.internal.TSMAPI;
 import user.tsm.client.api.internal.TSMAPIConstants;\r
 \r
 public class TSMBufferedClient extends TSMClient {\r
-\r
+       private static final Logger logger = LogManager.getLogger();\r
        private static final String APPNAME = "JOBENGINE";\r
        short rc = 0;\r
        private DataBlk dataBlk;\r
@@ -28,8 +31,32 @@ public class TSMBufferedClient extends TSMClient {
                super(APPNAME);\r
        }\r
 \r
-       public int recievePartial(byte[] buffer, TSMObject object, PartialObjData partialObjData) throws NullPointerException, FileNotFoundException, IOException,\r
-                       TSMException {\r
+       public void finishReceive() throws TSMException {\r
+               // dsmEndGetObj\r
+               rc = TSMAPI.dsmEndGetObj(dsmHandle);\r
+               if (rc != TSMAPIConstants.DSM_RC_OK) {\r
+                       TSMAPI.dsmEndGetData(dsmHandle);\r
+                       throw new TSMException(dsmHandle, rc);\r
+               }\r
+               // dsmEndGetData\r
+               rc = TSMAPI.dsmEndGetData(dsmHandle);\r
+               if (rc != TSMAPIConstants.DSM_RC_OK) {\r
+                       throw new TSMException(dsmHandle, rc);\r
+               }\r
+               dataBlk = null;\r
+       }\r
+\r
+       public void finishSend() throws TSMException, JNIException {\r
+               if (dataBlk != null) {\r
+                       rc = TSMAPI.dsmEndSendObj(dsmHandle);\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                               throw new TSMException(dsmHandle, rc);\r
+                       rc = vote(TSMAPIConstants.DSM_VOTE_COMMIT);\r
+               }\r
+       }\r
+\r
+       public int recievePartial(byte[] buffer, TSMObject object, PartialObjData partialObjData)\r
+                       throws NullPointerException, FileNotFoundException, IOException, TSMException {\r
                int result = 0;\r
 \r
                if (dataBlk == null) {\r
@@ -81,43 +108,10 @@ public class TSMBufferedClient extends TSMClient {
                return result;\r
        }\r
 \r
-       public void finishReceive() throws TSMException {\r
-               // dsmEndGetObj\r
-               rc = TSMAPI.dsmEndGetObj(dsmHandle);\r
-               if (rc != TSMAPIConstants.DSM_RC_OK) {\r
-                       TSMAPI.dsmEndGetData(dsmHandle);\r
-                       throw new TSMException(dsmHandle, rc);\r
-               }\r
-               // dsmEndGetData\r
-               rc = TSMAPI.dsmEndGetData(dsmHandle);\r
-               if (rc != TSMAPIConstants.DSM_RC_OK) {\r
-                       throw new TSMException(dsmHandle, rc);\r
-               }\r
-               dataBlk = null;\r
-       }\r
-\r
-       public void finishSend() throws TSMException, JNIException {\r
-               if (dataBlk != null) {\r
-                       rc = TSMAPI.dsmEndSendObj(dsmHandle);\r
-                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
-                               throw new TSMException(dsmHandle, rc);\r
-                       DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
-                       endTxnExIn.setDsmHandle(dsmHandle);\r
-                       endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_COMMIT);\r
-                       DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
-                       rc = TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
-                       if (rc != TSMAPIConstants.DSM_RC_OK) {\r
-                               throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
-                       }\r
-               }\r
-       }\r
-\r
-       public void send(byte[] buffer, TSMBackupFileObject object, int byteCount) throws NullPointerException, FileNotFoundException, IOException, TSMException {\r
+       public void send(byte[] buffer, TSMBackupFileObject object, int byteCount) throws Exception {\r
                short rc;\r
                try {\r
                        if (dataBlk == null) {\r
-                               dataBlk = new DataBlk();\r
-                               dataBlk.setBufferPtr(buffer);\r
                                rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
                                if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                        throw new TSMException(dsmHandle, rc);\r
@@ -143,45 +137,32 @@ public class TSMBufferedClient extends TSMClient {
                                        throw new TSMException(dsmHandle, rc);\r
                        }\r
 \r
+                       dataBlk = new DataBlk();\r
+                       dataBlk.setBufferPtr(buffer);\r
                        dataBlk.setBufferLen(byteCount);\r
                        rc = TSMAPI.dsmSendData(dsmHandle, dataBlk);\r
                        if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                throw new TSMException(dsmHandle, rc);\r
                        object.bytesWorked(byteCount);\r
+               } catch (Exception e) {\r
+                       vote(TSMAPIConstants.DSM_VOTE_ABORT);\r
+                       throw e;\r
+               }\r
+       }\r
 \r
-                       // if ((length = byteCount) > 0) {\r
-                       // dataBlk.setBufferLen(length);\r
-                       // rc = TSMAPI.dsmSendData(dsmHandle, dataBlk);\r
-                       // if (rc != TSMAPIConstants.DSM_RC_OK)\r
-                       // throw new TSMException(dsmHandle, rc);\r
-                       // object.bytesWorked(length);\r
-                       // if (length < prevLength) {\r
-                       // finishSend();\r
-                       // }\r
-                       // }\r
-               } catch (JNIException e1) {\r
-                       DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
-                       endTxnExIn.setDsmHandle(dsmHandle);\r
-                       endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
-                       DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
-                       try {\r
-                               TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
-                       } catch (Exception e) {\r
-                       }\r
-                       ;\r
-                       throw new TSMException("Internal error: " + e1.getMessage());\r
-               } catch (TSMException e2) {\r
-                       DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
-                       endTxnExIn.setDsmHandle(dsmHandle);\r
-                       endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
-                       DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
-                       try {\r
-                               TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
-                       } catch (Exception e) {\r
-                       }\r
-                       ;\r
-                       throw e2;\r
-               } finally {\r
+       private short vote(byte vote) throws TSMException {\r
+               short result = TSMAPIConstants.DSM_RC_OK;\r
+               DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
+               endTxnExIn.setDsmHandle(dsmHandle);\r
+               endTxnExIn.setVote(vote);\r
+               DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
+               try {\r
+                       result = TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
                }\r
+               if (result != TSMAPIConstants.DSM_RC_OK)\r
+                       throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
+               return result;\r
        }\r
 }\r