Commit 4aa458cd authored by David Fuhrmann's avatar David Fuhrmann

macosx: fix coredialog provider, fix dialog initialization

This removes the singleton, fixes the xib, and initializes
the dialog provider class at the correct time. dialog_Register
will be called only once now.
parent 673cd4db
......@@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1060</int>
<string key="IBDocument.SystemVersion">14B25</string>
<string key="IBDocument.InterfaceBuilderVersion">6254</string>
<string key="IBDocument.AppKitVersion">1343.16</string>
<string key="IBDocument.HIToolboxVersion">755.00</string>
<string key="IBDocument.SystemVersion">14F27</string>
<string key="IBDocument.InterfaceBuilderVersion">7706</string>
<string key="IBDocument.AppKitVersion">1348.17</string>
<string key="IBDocument.HIToolboxVersion">758.70</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="NS.object.0">6254</string>
<string key="NS.object.0">7706</string>
</object>
<array key="IBDocument.IntegratedClassDependencies">
<string>NSButton</string>
......@@ -31,7 +31,7 @@
</object>
<array class="NSMutableArray" key="IBDocument.RootObjects" id="893187804">
<object class="NSCustomObject" id="802493260">
<string key="NSClassName">NSObject</string>
<string key="NSClassName">VLCCoreDialogProvider</string>
</object>
<object class="NSCustomObject" id="559966113">
<string key="NSClassName">FirstResponder</string>
......@@ -61,6 +61,7 @@
<string key="NSFrame">{{94, 241}, {316, 17}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="895216305"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="576900989">
<int key="NSCellFlags">69206017</int>
......@@ -100,6 +101,7 @@
<string key="NSFrame">{{94, 189}, {394, 44}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="463407669"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="683480755">
<int key="NSCellFlags">69206017</int>
......@@ -123,6 +125,7 @@
<string key="NSFrame">{{97, 126}, {310, 22}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="377707840"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="577466516">
<int key="NSCellFlags">-1804599231</int>
......@@ -160,6 +163,7 @@
<string key="NSFrame">{{94, 156}, {129, 14}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="763771318"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="979127236">
<int key="NSCellFlags">67108864</int>
......@@ -179,6 +183,7 @@
<string key="NSFrame">{{97, 72}, {310, 22}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="648696081"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="113494320">
<int key="NSCellFlags">-1804599231</int>
......@@ -199,6 +204,7 @@
<string key="NSFrame">{{94, 102}, {129, 14}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="50035503"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="381438595">
<int key="NSCellFlags">67108864</int>
......@@ -218,6 +224,7 @@
<string key="NSFrame">{{383, 12}, {108, 32}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="357938558">
<int key="NSCellFlags">67108864</int>
......@@ -241,6 +248,7 @@
<string key="NSFrame">{{275, 12}, {108, 32}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="353086939"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="71468088">
<int key="NSCellFlags">67108864</int>
......@@ -272,6 +280,7 @@
<string key="NSFrame">{{20, 194}, {64, 64}}</string>
<reference key="NSSuperview" ref="784460927"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="848717079"/>
<bool key="NSEnabled">YES</bool>
<object class="NSImageCell" key="NSCell" id="1029161739">
<int key="NSCellFlags">134217728</int>
......@@ -292,15 +301,13 @@
<string key="NSFrameSize">{505, 278}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="603904908"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1280, 778}}</string>
<string key="NSScreenRect">{{0, 0}, {1280, 777}}</string>
<string key="NSMinSize">{213, 129}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<bool key="NSWindowIsRestorable">YES</bool>
</object>
<object class="NSCustomObject" id="493164665">
<string key="NSClassName">VLCCoreDialogProvider</string>
</object>
<object class="NSWindowTemplate" id="181099034">
<int key="NSWindowStyleMask">1</int>
<int key="NSWindowBacking">2</int>
......@@ -316,7 +323,7 @@
<nil key="NSUserInterfaceItemIdentifier"/>
<string key="NSWindowContentMinSize">{213, 107}</string>
<object class="NSView" key="NSWindowView" id="755575325">
<nil key="NSNextResponder"/>
<reference key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSTextField" id="787145765">
......@@ -324,6 +331,8 @@
<int key="NSvFlags">256</int>
<string key="NSFrame">{{89, 145}, {414, 17}}</string>
<reference key="NSSuperview" ref="755575325"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="565300589"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="310226383">
<int key="NSCellFlags">67108864</int>
......@@ -342,6 +351,8 @@
<int key="NSvFlags">256</int>
<string key="NSFrame">{{89, 95}, {414, 42}}</string>
<reference key="NSSuperview" ref="755575325"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="396289858"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="333125757">
<int key="NSCellFlags">67108864</int>
......@@ -360,6 +371,8 @@
<int key="NSvFlags">1280</int>
<string key="NSFrame">{{90, 56}, {412, 20}}</string>
<reference key="NSSuperview" ref="755575325"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="663300827"/>
<int key="NSpiFlags">16396</int>
<double key="NSMaxValue">1000</double>
</object>
......@@ -368,6 +381,8 @@
<int key="NSvFlags">256</int>
<string key="NSFrame">{{398, 12}, {108, 32}}</string>
<reference key="NSSuperview" ref="755575325"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="842982813">
<int key="NSCellFlags">67108864</int>
......@@ -398,6 +413,8 @@
</set>
<string key="NSFrame">{{20, 98}, {64, 64}}</string>
<reference key="NSSuperview" ref="755575325"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="787145765"/>
<bool key="NSEnabled">YES</bool>
<object class="NSImageCell" key="NSCell" id="958921464">
<int key="NSCellFlags">134217728</int>
......@@ -413,8 +430,11 @@
</object>
</array>
<string key="NSFrameSize">{520, 182}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="489898872"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1280, 778}}</string>
<string key="NSScreenRect">{{0, 0}, {1280, 777}}</string>
<string key="NSMinSize">{213, 129}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<bool key="NSWindowIsRestorable">YES</bool>
......@@ -425,138 +445,130 @@
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_win</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="404989243"/>
</object>
<int key="connectionID">290</int>
<int key="connectionID">330</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_title_txt</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="848717079"/>
</object>
<int key="connectionID">291</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_cancel_btn</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="648696081"/>
</object>
<int key="connectionID">292</int>
<int key="connectionID">331</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_description_txt</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="895216305"/>
</object>
<int key="connectionID">293</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_login_fld</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="763771318"/>
</object>
<int key="connectionID">294</int>
<int key="connectionID">332</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_login_txt</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="463407669"/>
</object>
<int key="connectionID">295</int>
<int key="connectionID">333</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_pw_txt</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="377707840"/>
<string key="label">o_auth_login_fld</string>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="763771318"/>
</object>
<int key="connectionID">296</int>
<int key="connectionID">334</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_ok_btn</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="353086939"/>
<string key="label">o_auth_pw_txt</string>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="377707840"/>
</object>
<int key="connectionID">297</int>
<int key="connectionID">335</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_auth_pw_fld</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="50035503"/>
</object>
<int key="connectionID">298</int>
<int key="connectionID">336</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">loginDialogAction:</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="648696081"/>
</object>
<int key="connectionID">299</int>
<int key="connectionID">338</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">loginDialogAction:</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="353086939"/>
</object>
<int key="connectionID">300</int>
<int key="connectionID">339</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_prog_title_txt</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="787145765"/>
<string key="label">o_auth_ok_btn</string>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="353086939"/>
</object>
<int key="connectionID">308</int>
<int key="connectionID">340</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_prog_bar</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="396289858"/>
<string key="label">o_prog_win</string>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="181099034"/>
</object>
<int key="connectionID">309</int>
<int key="connectionID">341</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_prog_cancel_btn</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="663300827"/>
<string key="label">o_prog_title_txt</string>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="787145765"/>
</object>
<int key="connectionID">310</int>
<int key="connectionID">342</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_prog_description_txt</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="565300589"/>
</object>
<int key="connectionID">311</int>
<int key="connectionID">343</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_prog_win</string>
<reference key="source" ref="493164665"/>
<reference key="destination" ref="181099034"/>
<string key="label">o_prog_bar</string>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="396289858"/>
</object>
<int key="connectionID">312</int>
<int key="connectionID">344</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">o_prog_cancel_btn</string>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="663300827"/>
</object>
<int key="connectionID">345</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">progDialogAction:</string>
<reference key="source" ref="493164665"/>
<reference key="source" ref="802493260"/>
<reference key="destination" ref="663300827"/>
</object>
<int key="connectionID">313</int>
<int key="connectionID">346</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
......@@ -676,12 +688,6 @@
</array>
<reference key="parent" ref="784460927"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">289</int>
<reference key="object" ref="493164665"/>
<reference key="parent" ref="0"/>
<string key="objectName">VLCCoreDialogProvider</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">301</int>
<reference key="object" ref="181099034"/>
......@@ -829,7 +835,6 @@
<string key="255.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="256.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="257.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="289.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="301.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="301.IBWindowTemplateEditedContentRect">{{412, 311}, {520, 182}}</string>
<string key="302.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
......@@ -857,7 +862,7 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">329</int>
<int key="maxID">346</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
......
......@@ -273,7 +273,7 @@ static int extensionDialogCallback(vlc_object_t *p_this, const char *psz_variabl
intf_thread_t *p_intf = VLCIntf;
var_Create(p_intf, "dialog-extension", VLC_VAR_ADDRESS);
var_AddCallback(p_intf, "dialog-extension", extensionDialogCallback, (__bridge void *)self);
dialog_Register(p_intf);
// dialog_Register(p_intf) is called by coredialog provider
}
return self;
}
......
......@@ -51,7 +51,6 @@
IBOutlet id o_prog_title_txt;
IBOutlet id o_prog_win;
}
+ (VLCCoreDialogProvider *)sharedInstance;
@property (atomic,readwrite) BOOL progressCancelled;
......
......@@ -29,55 +29,56 @@
/* for the icon in our custom error panel */
#import <ApplicationServices/ApplicationServices.h>
static void updateProgressPanel (void *, const char *, float);
static bool checkProgressPanel (void *);
static void destroyProgressPanel (void *);
static int DialogCallback(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data)
void updateProgressPanel (void *data, const char *text, float value)
{
@autoreleasepool {
if ([toNSStr(type) isEqualToString: @"dialog-progress-bar"]) {
/* the progress panel needs to update itself and therefore wants special treatment within this context */
dialog_progress_bar_t *p_dialog = (dialog_progress_bar_t *)value.p_address;
p_dialog->pf_update = updateProgressPanel;
p_dialog->pf_check = checkProgressPanel;
p_dialog->pf_destroy = destroyProgressPanel;
p_dialog->p_sys = VLCIntf->p_libvlc;
}
NSValue *o_value = [NSValue valueWithPointer:value.p_address];
[[VLCCoreDialogProvider sharedInstance] performEventWithObject: o_value ofType: type];
VLCCoreDialogProvider *dialogProvider = (__bridge VLCCoreDialogProvider *)data;
return VLC_SUCCESS;
}
}
void updateProgressPanel (void *priv, const char *text, float value)
{
@autoreleasepool {
NSString *o_txt = toNSStr(text);
dispatch_async(dispatch_get_main_queue(), ^{
[[VLCCoreDialogProvider sharedInstance] updateProgressPanelWithText: o_txt andNumber: (double)(value * 1000.)];
[dialogProvider updateProgressPanelWithText: o_txt andNumber: (double)(value * 1000.)];
});
}
}
void destroyProgressPanel (void *priv)
void destroyProgressPanel (void *data)
{
@autoreleasepool {
VLCCoreDialogProvider *dialogProvider = (__bridge VLCCoreDialogProvider *)data;
if ([[NSApplication sharedApplication] isRunning])
[[VLCCoreDialogProvider sharedInstance] performSelectorOnMainThread:@selector(destroyProgressPanel) withObject:nil waitUntilDone:YES];
[dialogProvider performSelectorOnMainThread:@selector(destroyProgressPanel) withObject:nil waitUntilDone:YES];
}
}
bool checkProgressPanel (void *priv)
bool checkProgressPanel (void *data)
{
@autoreleasepool {
return [[VLCCoreDialogProvider sharedInstance] progressCancelled];
VLCCoreDialogProvider *dialogProvider = (__bridge VLCCoreDialogProvider *)data;
return [dialogProvider progressCancelled];
}
}
static int DialogCallback(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data)
{
@autoreleasepool {
VLCCoreDialogProvider *dialogProvider = (__bridge VLCCoreDialogProvider *)data;
if ([toNSStr(type) isEqualToString: @"dialog-progress-bar"]) {
/* the progress panel needs to update itself and therefore wants special treatment within this context */
dialog_progress_bar_t *p_dialog = (dialog_progress_bar_t *)value.p_address;
p_dialog->pf_update = updateProgressPanel;
p_dialog->pf_check = checkProgressPanel;
p_dialog->pf_destroy = destroyProgressPanel;
p_dialog->p_sys = (__bridge void *)dialogProvider;
}
NSValue *o_value = [NSValue valueWithPointer:value.p_address];
[dialogProvider performEventWithObject: o_value ofType: type];
return VLC_SUCCESS;
}
}
@interface VLCCoreDialogProvider()
{
......@@ -87,23 +88,14 @@ bool checkProgressPanel (void *priv)
@implementation VLCCoreDialogProvider
+ (VLCCoreDialogProvider *)sharedInstance
{
static VLCCoreDialogProvider *sharedInstance = nil;
static dispatch_once_t pred;
dispatch_once(&pred, ^{
sharedInstance = [VLCCoreDialogProvider new];
});
return sharedInstance;
}
- (instancetype)init
{
self = [super init];
if (self) {
msg_Dbg(VLCIntf, "Register dialog provider");
[NSBundle loadNibNamed:@"CoreDialogs" owner: self];
intf_thread_t *p_intf = VLCIntf;
/* subscribe to various interactive dialogues */
var_Create(p_intf, "dialog-error", VLC_VAR_ADDRESS);
......@@ -118,18 +110,21 @@ bool checkProgressPanel (void *priv)
var_AddCallback(p_intf, "dialog-progress-bar", DialogCallback, (__bridge void *)self);
dialog_Register(p_intf);
}
return self;
}
- (void)dealloc
{
msg_Dbg(VLCIntf, "Deinitializing dialog provider");
intf_thread_t *p_intf = VLCIntf;
dialog_Unregister(p_intf);
var_DelCallback(p_intf, "dialog-error", DialogCallback, (__bridge void *)self);
var_DelCallback(p_intf, "dialog-critical", DialogCallback, (__bridge void *)self);
var_DelCallback(p_intf, "dialog-login", DialogCallback, (__bridge void *)self);
var_DelCallback(p_intf, "dialog-question", DialogCallback, (__bridge void *)self);
var_DelCallback(p_intf, "dialog-progress-bar", DialogCallback, (__bridge void *)self);
dialog_Unregister(p_intf);
}
-(void)awakeFromNib
......
......@@ -154,7 +154,6 @@ static int ShowController(vlc_object_t *p_this, const char *psz_variable,
int items_at_launch;
BOOL nib_about_loaded; /* about nibfile */
BOOL nib_coredialogs_loaded; /* CoreDialogs nibfile */
BOOL b_active_videoplayback;
NSWindowController *_mainWindowController;
......@@ -215,7 +214,11 @@ static VLCMain *sharedInstance = nil;
[VLCApplication sharedApplication].delegate = self;
_input_manager = [[VLCInputManager alloc] initWithMain:self];
// first initalize extensions dialog provider, then core dialog
// provider which will register both at the core
_extensionsManager = [[ExtensionsManager alloc] init];
_coredialogs = [[VLCCoreDialogProvider alloc] init];
_mainmenu = [[VLCMainMenu alloc] init];
_voutController = [[VLCVoutWindowController alloc] init];
......@@ -600,11 +603,6 @@ static VLCMain *sharedInstance = nil;
- (VLCCoreDialogProvider *)coreDialogProvider
{
_coredialogs = [VLCCoreDialogProvider sharedInstance];
if (!nib_coredialogs_loaded) {
nib_coredialogs_loaded = [NSBundle loadNibNamed:@"CoreDialogs" owner: _coredialogs];
}
return _coredialogs;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment