using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using NT2chView.NtNet;
using NT2chView.NtHtml;
using System.Web;
using NT2chView.NtFile;
namespace NT2chView
{
///
/// NTWriteResWindow.xaml の相互作用ロジック
///
public partial class NTWriteResWindow : Window
{
NTThreadTitle mThread;
MainWindow mMainWindow;
string mDatName;
string mBoardName;
string mHostName;
//string mSiteMsg;
string[] mHistory = null;
public NTWriteResWindow(MainWindow main, NTThreadTitle thread, string siteMsg)
{
InitializeComponent();
mMainWindow = main;
mThread = thread;
//mSiteMsg = siteMsg;
if (thread.mBoard.mMachiBBS)
{
chkWriteTroughP2.IsEnabled = false;
}
else
{
chkWriteTroughP2.IsChecked = NTUserPreference.P2IsEnabled;
}
chkSage.IsChecked = NTUserPreference.SageIsEnabled;
Title = thread.Title;
mHistory = NTPersistentFileAccess.retrieveWriteHistroy();
if (mHistory == null || mHistory.Length == 0)
{
btnWriteHistory.IsEnabled = false;
}
if (siteMsg != null && siteMsg.Length > 0)
{
txtMsg.Text = siteMsg;
}
txtMsg.Focus();
}
private void btnWriteResClose_Click(object sender, RoutedEventArgs e)
{
storeMsgToHistory();
Close();
}
private void btnWriteRes_Click(object sender, RoutedEventArgs e)
{
WriteRes_Invoke();
}
private void WriteRes_Invoke()
{
mThread.mWroteMsg = string.Empty;
setupServerParam();
string [] args = preWriteRes();
bool result = false;
if (!NTHttpUtils.isValid2chAddress(mThread.mBoard.mAddress))
{
if (mThread.mBoard.mMachiBBS)
{
if (writeResMachiBBS(args, null))
{
result = true;
}
}
else
{
if (writeResExternalBBS(mThread.mBoard.mAddress, args, null))
{
result = true;
}
}
}
else{
if (NTUserPreference.P2IsEnabled)
{
if (writeResP2(args, null))
{
result = true;
}
}
else
{
if (writeRes(args, null))
{
result = true;
}
}
}
if (result)
{
mThread.mWroteMsg = txtMsg.Text;
mMainWindow.WriteResCallback(true, mThread);
storeMsgToHistory();
Close();
}
}
private bool setupServerParam()
{
NTBoard board = mThread.mBoard;
mDatName = NTHttpUtils.ridSuffixFromDatName(mThread.mDat);
string hostName;
string boardName;
if (!NTHttpUtils.parseHostAddress(board.mAddress, out hostName, out boardName))
return false;
mBoardName = boardName;
mHostName = hostName;
return true;
}
private string [] preWriteRes()
{
if (!setupServerParam())
return null;
string mail;
string name;
string msg;
if (chkSage.IsChecked.HasValue && ((bool)chkSage.IsChecked))
mail = "sage";
else
mail = txtMail.Text;
name = txtName.Text;
msg = txtMsg.Text;
mail = (mail == null) ? string.Empty : mail;
name = (name == null) ? string.Empty : name;
msg = (msg == null) ? string.Empty : msg;
string[] args = new string[7];
args[0] = mHostName;
args[1] = mBoardName;
args[2] = mDatName;
args[3] = name;
args[4] = mail;
args[5] = msg;
args[6] = NTHttpUtils.DEFAULT_SUBMIT;
return args;
}
private bool writeResP2(string[] args, List> extra)
{
string htmlStr = NTHttpAccess.writeResP2(args, extra, mThread.ResCnt, mThread.Title, false);
if (null == htmlStr)
{
MessageBox.Show("サーバーの応答が不正です");
return false;
}
FlowDocument doc = new FlowDocument();
NTHtmlParser htmlParser = new NTHtmlParser(doc);
string parsedHtml = htmlParser.parse(htmlStr);
if (parsedHtml == null)
{
MessageBox.Show("サーバーの応答が不正です");
return false;
}
X_CONFIRM_RESULT xResult = NTHtmlWriteResParser.validateResult(htmlParser);
if (xResult == X_CONFIRM_RESULT.SUCCESS)
return true;
NTDebug.l(parsedHtml);
NTWriteResResultWindow w
= new NTWriteResResultWindow(htmlParser.getTitle(), doc, xResult);
w.Owner = this;
bool? result = w.ShowDialog();
if (result.HasValue && ((bool)result))
{
List> list = htmlParser.mInputTypeSubmit;
if (list.Count > 0)
{
args[6] = list[0].Value;
return writeResP2(args, htmlParser.mInputTypeHidden);
}
}
return false;
}
private bool writeRes(string[] args, List> extra)
{
string htmlStr = NTHttpAccess.writeRes(args, extra);
if (null == htmlStr)
{
MessageBox.Show("サーバーの応答が不正です");
return false;
}
FlowDocument doc = new FlowDocument();
NTHtmlParser htmlParser = new NTHtmlParser(doc);
string parsedHtml = htmlParser.parse(htmlStr);
if (parsedHtml == null)
{
MessageBox.Show("サーバーの応答が不正です");
return false;
}
X_CONFIRM_RESULT xResult = NTHtmlWriteResParser.validateResult(htmlParser);
if (xResult == X_CONFIRM_RESULT.SUCCESS)
return true;
NTDebug.l(parsedHtml);
NTWriteResResultWindow w
= new NTWriteResResultWindow(htmlParser.getTitle(), doc, xResult);
w.Owner = this;
bool? result = w.ShowDialog();
if (result.HasValue && ((bool)result))
{
List> list = htmlParser.mInputTypeSubmit;
if (list.Count > 0)
{
args[6] = list[0].Value;
return writeRes(args, htmlParser.mInputTypeHidden);
}
}
return false;
}
private bool writeResMachiBBS(string[] args, List> extra)
{
//string host, bbs;
string name = args[3];
string mail = args[4];
string msg = args[5];
//if (!NTHttpUtils.splitMachiAddress(args[0], out host, out bbs))
// return false;
string key = NTHttpUtils.ridSuffixFromCgiName(args[2]);
// public static string getWriteHtmlMachiBBS(string host, string board, string key)
// {
string a1 = "/bbs/read.pl?IMODE=TRUE&KEY=";//1341122306
string a2 = "&BBS=";//tokyo
string a3 = "&WRITEBOX=TRUE";
string url1 = "http://"+args[0] + a1 + key + a2 + args[1] + a3;
//string writeHtml = NTHttpAccess.getWriteHtmlMachiBBS(url1);
string writeHtml = NTHttpAccess.getWriteHtmlExternalBBS(args[0], url1);
if (writeHtml == null || writeHtml.Length == 0)
return false;
NTHtmlParser parser = new NTHtmlParser(new FlowDocument());
string resultStr = parser.parse(writeHtml);
NTDebug.l(resultStr);
Encoding enc = Encoding.GetEncoding(NTAppState.HOST_2CH_ENCODING);
List> fAttr = parser.mFormAttributes;
if (fAttr == null)
return false;
string url2 = null;
//
foreach (KeyValuePair pair in fAttr)
{
if (pair.Key.Equals("action", StringComparison.CurrentCultureIgnoreCase))
{
string s = pair.Value;
int idx = s.IndexOf('/');
if(idx < 0)
break;
s = s.Substring(idx);
idx = s.IndexOf('?');
if(idx >= 0)
s = s.Substring(0,idx);
url2 = "http://" + args[0] + "/bbs" + s;
break;
}
}
if(url2 == null)
return false;
StringBuilder postData = new StringBuilder(256);
postData.Append("NAME=").Append(HttpUtility.UrlEncode(name, enc));
postData.Append("&MAIL=").Append(HttpUtility.UrlEncode(mail, enc));
foreach(KeyValuePair pair3 in parser.mInputTypeHidden)
{
string val = HttpUtility.UrlEncode(pair3.Value, enc);
NTDebug.l(val + " :"+val.Length);
postData.Append('&').Append(pair3.Key).Append('=')
.Append(val);
}
postData.Append("&MESSAGE=").Append(HttpUtility.UrlEncode(msg, enc));
NTDebug.l(postData.ToString());
resultStr = NTHttpAccess.writeResExternalBBS(url2, url1, "http://" + args[0], postData.ToString());
NTDebug.l(resultStr);
if (resultStr == null)
{
MessageBox.Show("サーバーの応答が不正です");
return false;
}
FlowDocument doc = new FlowDocument();
parser = new NTHtmlParser(doc);
parser.parse(resultStr);
X_CONFIRM_RESULT xResult = NTHtmlWriteResParser.validateResult(parser);
if (xResult != X_CONFIRM_RESULT.ERROR)
return true;
NTWriteResResultWindow w
= new NTWriteResResultWindow(parser.getTitle(), doc, xResult);
w.Owner = this;
bool? result = w.ShowDialog();
if (result.HasValue && ((bool)result))
{
List> list = parser.mInputTypeSubmit;
if (list.Count > 0)
{
args[6] = list[0].Value;
return writeResMachiBBS(args, parser.mInputTypeHidden);
}
}
return false;
}
private List>
parseWriteResPostParams(NTHtmlParser parser, string key, string from, string mail, string msg)
{
List> pLIst = new List>();
bool setSubmit = false;
foreach (KeyValuePair pair in parser.mInputTypeSubmit)
{
string v = pair.Value;
if (v.Contains("W") || v.Contains("書"))
{
pLIst.Add(pair);
setSubmit = true;
break;
}
}
if(!setSubmit)
return null;
bool setKey = false;
foreach (KeyValuePair pair in parser.mInputTypeHidden)
{
string k = pair.Key;
bool dup = false;
switch (k)
{
case "KEY":
case "key":
if (!setKey)
{
pLIst.Add(new KeyValuePair(k, key));
setKey = true;
}
break;
default:
foreach (KeyValuePair pair2 in pLIst)
{
if (pair2.Key.Equals(k, StringComparison.CurrentCultureIgnoreCase))
{
dup = true;
break;
}
}
if(!dup)
pLIst.Add(pair);
break;
}
}
bool setFrom = false;
bool setMail = false;
foreach (KeyValuePair pair in parser.mInputTypeText)
{
string k = pair.Key;
switch (k)
{
case "FROM":
case "from":
case "name":
case "NAME":
if (!setFrom)
{
pLIst.Add(new KeyValuePair(k, from));
setFrom = true;
}
break;
case "mail":
case "MAIL":
case "TO":
case "to":
if (!setMail)
{
pLIst.Add(new KeyValuePair(k, mail));
setMail = true;
}
break;
}
if (setFrom && setMail)
break;
}
if (!setMail || !setMail)
return null;
bool setMsg = false;
foreach (KeyValuePair pair in parser.mTextAreaAttributes)
{
string v = pair.Value;
switch (v)
{
case "MESSAGE":
case "message":
if (!setMsg)
{
pLIst.Add(new KeyValuePair(v, msg));
setMsg = true;
}
break;
}
if (setMsg)
break;
}
if (!setMsg)
return null;
return pLIst;
}
private bool writeResExternalBBS(string baseUrl, string[] args, List> extra)
{
string host = args[0];//, bbs;
string name = args[3];
string mail = args[4];
string msg = args[5];
string key = args[2];
int idx = baseUrl.IndexOf(host);
if (idx < 0)
return false;
idx += host.Length;
string url = baseUrl.Substring(0, idx) + "/test/read.cgi" +
baseUrl.Substring(idx) + key + '/';
NTHtmlParser parser = null;
string resultStr = null;
Mouse.OverrideCursor = Cursors.Wait;
try
{
string writeHtml = NTHttpAccess.getWriteHtmlExternalBBS(host, url);
if (writeHtml != null && writeHtml.Length > 0)
{
parser = new NTHtmlParser(new FlowDocument());
resultStr = parser.parse(writeHtml);
}
if (writeHtml == null || parser == null ||
parser.mFormAttributes.Count == 0 || parser.mInputTypeHidden.Count == 0)
{
url = baseUrl;
writeHtml = NTHttpAccess.getWriteHtmlExternalBBS(host, url);
if (writeHtml == null || writeHtml.Length == 0)
return false;
parser = new NTHtmlParser(new FlowDocument());
resultStr = parser.parse(writeHtml);
if (parser.mFormAttributes.Count == 0 || parser.mInputTypeHidden.Count == 0)
return false;
}
string newUrl = NTHtmlUtils.parseActionUrl(host, url, parser);
if (newUrl == null)
return false;
List> pList = parseWriteResPostParams(parser, key, name, mail, msg);
if (pList == null)
return false;
Encoding enc = Encoding.GetEncoding(NTAppState.HOST_2CH_ENCODING);
StringBuilder postData = new StringBuilder(256);
foreach (KeyValuePair pair in pList)
{
if (postData.Length != 0)
postData.Append('&');
postData.Append(pair.Key).Append('=')
.Append(HttpUtility.UrlEncode(pair.Value, enc));
}
NTDebug.l(postData.ToString());
resultStr = NTHttpAccess.writeResExternalBBS(newUrl, url, args[0], postData.ToString());
}
finally
{
Mouse.OverrideCursor = null;
}
NTDebug.l(resultStr);
if (resultStr == null)
{
MessageBox.Show("サーバーの応答が不正です");
return false;
}
FlowDocument doc = new FlowDocument();
parser = new NTHtmlParser(doc);
parser.parse(resultStr);
X_CONFIRM_RESULT xResult = NTHtmlWriteResParser.validateResult(parser);
if (xResult != X_CONFIRM_RESULT.ERROR)
return true;
NTWriteResResultWindow w
= new NTWriteResResultWindow(parser.getTitle(), doc, xResult);
w.Owner = this;
bool? result = w.ShowDialog();
return false;
}
private void chkSage_Checked(object sender, RoutedEventArgs e)
{
NTDebug.l("checked!");
NTUserPreference.SageIsEnabled = true;
//NTUserPreference.savePreferences();
}
private void chkSage_Unchecked(object sender, RoutedEventArgs e)
{
NTDebug.l("unchecked!");
NTUserPreference.SageIsEnabled = false;
//NTUserPreference.savePreferences();
}
private void chkWriteTroughP2_Checked(object sender, RoutedEventArgs e)
{
//NTDebug.l("checked!");
NTUserPreference.P2IsEnabled = true;
// NTUserPreference.savePreferences();
}
private void chkWriteTroughP2_Unchecked(object sender, RoutedEventArgs e)
{
//NTDebug.l("checked!");
NTUserPreference.P2IsEnabled = false;
//NTUserPreference.savePreferences();
}
private void storeMsgToHistory()
{
string msg = txtMsg.Text;
if (msg.Length == 0)
return;
string newMsg = NTTextFormat.convertLineBreakToHtmlTag(msg);
NTPersistentFileAccess.storeWriteHistory(newMsg);
}
//bool mLeftShift = false;
//bool mRightShift = false;
private void NTWriteResWindow_PreviewKeyDown(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.LeftShift:
// mLeftShift = true;
break;
case Key.RightShift:
//mRightShift = true;
break;
case Key.Enter:
if(Keyboard.Modifiers == ModifierKeys.Shift)
//if (mLeftShift || mRightShift)
{
NTDebug.l("Pressed Shift + Enter!");
WriteRes_Invoke();
e.Handled = true;
}
break;
case Key.Escape:
if (Keyboard.Modifiers == ModifierKeys.Shift)
{
NTDebug.l("Pressed ESC!");
e.Handled = true;
storeMsgToHistory();
Close();
}
break;
}
}
private void NTWriteResWindow_PreviewKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftShift)
{
//mLeftShift = false;
}
else if (e.Key == Key.RightShift)
{
//mRightShift = false;
}
}
private void btnWriteHistory_Click(object sender, RoutedEventArgs e)
{
NTWriteResHistoryPopup popup = new NTWriteResHistoryPopup(this, mHistory);
popup.show();
}
public void setMsg(string msg)
{
txtMsg.Text = msg;
}
}
}