1/*
2 * Copyright 1998-1999 Be, Inc. All Rights Reserved.
3 * Copyright 2003-2019 Haiku, Inc. All rights reserved.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef CODYCAM_H
7#define CODYCAM_H
8
9
10#include <string.h>
11
12#include <Application.h>
13#include <Box.h>
14#include <Catalog.h>
15#include <CheckBox.h>
16#include <Locale.h>
17#include <Menu.h>
18#include <MenuField.h>
19#include <StringView.h>
20#include <TextControl.h>
21#include <Window.h>
22
23#include "Settings.h"
24#include "VideoConsumer.h"
25
26
27class BMediaRoster;
28
29
30enum {
31	msg_filename	= 'file',
32
33	msg_rate_changed = 'rate',
34
35	msg_translate	= 'tran',
36
37	msg_upl_client	= 'ucli',
38	msg_server		= 'srvr',
39	msg_login		= 'lgin',
40	msg_password	= 'pswd',
41	msg_directory	= 'drct',
42	msg_passiveftp	= 'pasv',
43	msg_pswrd_text	= 'pstx',
44
45	msg_start		= 'strt',
46	msg_stop		= 'stop',
47
48	msg_setup		= 'setp',
49	msg_video		= 'vdeo',
50
51	msg_control_win = 'ctlw'
52};
53
54
55struct capture_rate {
56	const char* name;
57	time_t		seconds;
58};
59
60
61// NOTE: These are translated once the app catalog is loaded.
62capture_rate kCaptureRates[] = {
63	{"Every 15 seconds", 15 },
64	{"Every 30 seconds", 30 },
65	{"Every minute", 60 },
66	{"Every 5 minutes", 5 * 60 },
67	{"Every 10 minutes", 10 * 60 },
68	{"Every 15 minutes", 15 * 60 },
69	{"Every 30 minutes", 30 * 60 },
70	{"Every hour", 60 * 60 },
71	{"Every 2 hours", 2 * 60 * 60 },
72	{"Every 4 hours", 4 * 60 * 60 },
73	{"Every 8 hours", 8 * 60 * 60 },
74	{"Every 24 hours", 24 * 60 * 60 },
75	{"Never", 0 }
76};
77
78
79const int32 kCaptureRatesCount = sizeof(kCaptureRates) / sizeof(capture_rate);
80
81
82const char* kUploadClients[] = {
83	// NOTE: These are translated once the app catalog is loaded.
84	"FTP",
85	"SFTP",
86	"Local"
87};
88
89
90const int32 kUploadClientsCount = sizeof(kUploadClients) / sizeof(char*);
91
92class VideoWindow;
93class ControlWindow;
94
95class CodyCam : public BApplication {
96public:
97							CodyCam();
98	virtual					~CodyCam();
99
100			void			ReadyToRun();
101	virtual	bool			QuitRequested();
102	virtual	void			MessageReceived(BMessage* message);
103
104private:
105			status_t		_SetUpNodes();
106			void			_TearDownNodes();
107
108			BMediaRoster*	fMediaRoster;
109			media_node		fTimeSourceNode;
110			media_node		fProducerNode;
111			VideoConsumer*	fVideoConsumer;
112			media_output	fProducerOut;
113			media_input		fConsumerIn;
114			VideoWindow*	fWindow;
115			port_id			fPort;
116			ControlWindow*	fVideoControlWindow;
117};
118
119
120class VideoWindow : public BWindow {
121public:
122							VideoWindow(const char* title,
123								window_type type, uint32 flags,
124								port_id* consumerport);
125							~VideoWindow();
126
127	virtual	bool			QuitRequested();
128	virtual	void			MessageReceived(BMessage* message);
129
130			void			ApplyControls();
131
132			BView*			VideoView();
133			BStringView*	StatusLine();
134			void			ToggleMenuOnOff();
135
136			void			ErrorAlert(const char*, status_t);
137
138private:
139			void			_BuildCaptureControls();
140
141			void			_SetUpSettings(const char* filename,
142								const char* dirname);
143			void			_UploadClientChanged();
144			void			_QuitSettings();
145
146private:
147			media_node*		fProducer;
148			port_id*		fPortPtr;
149
150			BView*			fVideoView;
151			BTextView*		fErrorView;
152
153			BTextControl*	fFileName;
154			BBox*			fCaptureSetupBox;
155			BMenu*			fCaptureRateMenu;
156			BMenuField*		fCaptureRateSelector;
157			BMenu*			fImageFormatMenu;
158			BMenuField*		fImageFormatSelector;
159			BMenu*			fUploadClientMenu;
160			BMenuField*		fUploadClientSelector;
161			BBox*			fFtpSetupBox;
162			BTextControl*	fServerName;
163			BTextControl*	fLoginId;
164			BTextControl*	fPassword;
165			BTextControl*	fDirectory;
166			BCheckBox*		fPassiveFtp;
167			BBox*			fStatusBox;
168			BStringView*	fStatusLine;
169
170			ftp_msg_info	fFtpInfo;
171
172			Settings*		fSettings;
173
174			BMenu* 			fMenu;
175
176			StringValueSetting*		fServerSetting;
177			StringValueSetting*		fLoginSetting;
178			StringValueSetting*		fPasswordSetting;
179			StringValueSetting*		fDirectorySetting;
180			BooleanValueSetting*	fPassiveFtpSetting;
181			StringValueSetting*		fFilenameSetting;
182			StringValueSetting*		fImageFormatSettings;
183
184			EnumeratedStringValueSetting*	fUploadClientSetting;
185			EnumeratedStringValueSetting*	fCaptureRateSetting;
186};
187
188
189class ControlWindow : public BWindow {
190public:
191							ControlWindow(BView* controls,
192								media_node node);
193			void			MessageReceived(BMessage* message);
194			bool			QuitRequested();
195
196private:
197			BView*			fView;
198			media_node		fNode;
199};
200
201#endif	// CODYCAM_H
202