git-svn-id: https://192.168.0.254/svn/Proyectos.Incam_SGD/tags/3.7.0.2_original@1 eb19766c-00d9-a042-a3a0-45cb8ec72764
524 lines
13 KiB
C#
524 lines
13 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Net;
|
|
using System.IO;
|
|
using System.Collections;
|
|
using System.Data;
|
|
using System.Data.Odbc;
|
|
using System.Runtime.Remoting;
|
|
using System.Runtime.Remoting.Channels;
|
|
using System.Runtime.Remoting.Messaging;
|
|
using System.Runtime.Remoting.Activation;
|
|
using System.Runtime.Remoting.Services;
|
|
using System.Runtime.Serialization;
|
|
using System.Text.RegularExpressions;
|
|
using System.Web.Services.Protocols;
|
|
using System.Reflection;
|
|
using System.Web;
|
|
using System.Xml;
|
|
using System.Web.Services;
|
|
using System.Diagnostics;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Web.Services.Description;
|
|
using System.Web.Services.Discovery;
|
|
using System.Xml.Serialization;
|
|
using System.Xml.Schema;
|
|
using System.Threading;
|
|
using System.Web.Services.Protocols;
|
|
|
|
namespace MonoTests.KnowledgeTree
|
|
{
|
|
|
|
|
|
|
|
[System.Web.Services.WebServiceBinding(Name="KnowledgeTreePort", Namespace="urn:KnowledgeTree")]
|
|
public class KTWebService : KnowledgeTreeService
|
|
{
|
|
public KTWebService() : base()
|
|
{
|
|
this.Url = Environment.GetEnvironmentVariable("KT_ROOT_URL") + "/ktwebservice/webservice.php";
|
|
}
|
|
}
|
|
|
|
public class MySoapHttpClientProtocol : SoapHttpClientProtocol
|
|
{
|
|
public MySoapHttpClientProtocol() : base() {}
|
|
|
|
public object [] ReceiveResponse (WebResponse response, SoapClientMessage message, SoapExtension[] extensions)
|
|
{
|
|
|
|
StreamReader sr = new StreamReader(response.GetResponseStream());
|
|
String content = sr.ReadToEnd();
|
|
System.Console.WriteLine(content);
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public class KTTest
|
|
{
|
|
protected KTWebService _kt;
|
|
protected String _session;
|
|
protected bool _verbose;
|
|
|
|
|
|
public KTTest()
|
|
{
|
|
this._kt = new KTWebService();
|
|
kt_response response = this._kt.login("admin","admin","127.0.0.1");
|
|
this._session = response.message;
|
|
this._verbose = false;
|
|
this.setupDb();
|
|
|
|
//System.Web.Services.Protocols.SoapHttpClientProtocol.ReceiveResponse
|
|
}
|
|
|
|
void setupDb()
|
|
{
|
|
|
|
String connectionString = "DSN=ktdms;" + "UID=root;" + "PWD=";
|
|
try
|
|
{
|
|
IDbConnection dbcon = new OdbcConnection(connectionString);
|
|
if (dbcon == null)
|
|
{
|
|
System.Console.WriteLine("Cannot create connection");
|
|
}
|
|
dbcon.Open();
|
|
IDbCommand dbcmd = dbcon.CreateCommand();
|
|
if (dbcmd == null)
|
|
{
|
|
System.Console.WriteLine("Cannot create command");
|
|
}
|
|
dbcmd.CommandText = "DELETE FROM folders WHERE id > 1";
|
|
dbcmd.CommandType = CommandType.Text;
|
|
dbcmd.ExecuteNonQuery();
|
|
dbcmd.CommandText = "DELETE FROM documents";
|
|
dbcmd.CommandType = CommandType.Text;
|
|
dbcmd.ExecuteNonQuery();
|
|
dbcmd.CommandText = "DELETE FROM document_types_lookup WHERE name = 'NewType'";
|
|
dbcmd.ExecuteNonQuery();
|
|
dbcmd.CommandText = "INSERT INTO document_types_lookup(id,name) VALUES(2,'NewType')";
|
|
dbcmd.ExecuteNonQuery();
|
|
dbcmd.Dispose();
|
|
dbcmd = null;
|
|
dbcon.Close();
|
|
dbcon = null;
|
|
}
|
|
catch(Exception ex)
|
|
{
|
|
System.Console.WriteLine(ex.Message);
|
|
}
|
|
}
|
|
|
|
~KTTest()
|
|
{
|
|
this._kt.logout(this._session);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public class FileUploader
|
|
{
|
|
private String boundary;
|
|
private String uri;
|
|
public String filename;
|
|
|
|
|
|
public FileUploader(String uri)
|
|
{
|
|
this.uri = uri;
|
|
System.Console.WriteLine("Using upload URL: " + uri);
|
|
this.boundary = "----" + DateTime.Now.Ticks.ToString("x");
|
|
}
|
|
|
|
public FileUploader() : this(Environment.GetEnvironmentVariable("KT_ROOT_URL") + "/ktwebservice/upload.php")
|
|
{
|
|
}
|
|
|
|
|
|
public String getFilename()
|
|
{
|
|
return this.filename;
|
|
}
|
|
|
|
|
|
public void upload(String sessionid, String filename)
|
|
{
|
|
String displayname = Path.GetFileName(filename);
|
|
StringBuilder header = new StringBuilder();
|
|
|
|
header.Append("--" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"session_id\"\r\n\r\n" + sessionid + "\r\n");
|
|
header.Append("--" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"action\"\r\n\r\nA\r\n");
|
|
header.Append("--" + boundary + "\r\n" + "Content-Disposition: form-data; name=\"output\"\r\n\r\nxml\r\n");
|
|
|
|
header.Append("--" + boundary + "\r\n");
|
|
header.Append("Content-Disposition: form-data; name=\"name\";");
|
|
header.Append("filename=\"" + displayname + "\"\r\nContent-Type: application/octet-stream\r\n\r\n");
|
|
|
|
|
|
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(this.uri);
|
|
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
|
|
webrequest.Method = "POST";
|
|
|
|
|
|
byte[] headerArray = Encoding.UTF8.GetBytes(header.ToString());
|
|
byte[] boundaryArray = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
|
|
|
|
FileStream file = new FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
|
|
|
|
long filesize = file.Length;
|
|
webrequest.ContentLength = headerArray.Length + filesize + boundaryArray.Length;
|
|
|
|
Stream requestStream = webrequest.GetRequestStream();
|
|
requestStream.Write(headerArray, 0, headerArray.Length);
|
|
|
|
byte[] buffer = new byte[10240];
|
|
|
|
int read = 0;
|
|
|
|
while ((read = file.Read(buffer, 0, buffer.Length)) > 0)
|
|
{
|
|
|
|
requestStream.Write(buffer, 0, read);
|
|
}
|
|
|
|
requestStream.Write(boundaryArray, 0, boundaryArray.Length);
|
|
|
|
|
|
WebResponse response = webrequest.GetResponse();
|
|
StreamReader sr = new StreamReader(response.GetResponseStream());
|
|
String xml = sr.ReadToEnd();
|
|
//System.Console.WriteLine("xml: " + xml);
|
|
|
|
|
|
|
|
if (xml.IndexOf("<status_code>0</status_code>") != -1)
|
|
{
|
|
long tmp = this.tokenInt("filesize",xml);
|
|
if (tmp != filesize)
|
|
{
|
|
throw new Exception("Filesize should be " + filesize + " but appears to be "+ tmp);
|
|
}
|
|
|
|
tmp = this.tokenInt("error",xml);
|
|
if (tmp > 0)
|
|
{
|
|
throw new Exception("The server reported error code " + tmp + " for the file upload");
|
|
}
|
|
this.filename = this.tokenString("filename",xml);
|
|
// yay, all is good!
|
|
return;
|
|
}
|
|
|
|
String msg = this.tokenString("msg", xml);
|
|
long error = this.tokenInt("error", xml);
|
|
if (error > 0)
|
|
{
|
|
throw new Exception("The server reported error code " + error + " for the file upload");
|
|
}
|
|
|
|
throw new Exception("Upload error: " + msg);
|
|
|
|
}
|
|
|
|
private String tokenString(String token, String xml)
|
|
{
|
|
int tokStart = xml.IndexOf("<"+token+">") + token.Length+2;
|
|
int tokEnd = xml.IndexOf("</"+token+">");
|
|
if (tokEnd == -1) return "";
|
|
|
|
String value = xml.Substring(tokStart, tokEnd-tokStart);
|
|
//System.Console.WriteLine(token + ": " + value);
|
|
return value;
|
|
}
|
|
|
|
private long tokenInt(String token, String xml)
|
|
{
|
|
String value = this.tokenString(token, xml);
|
|
if (value.Equals(""))
|
|
{
|
|
return -1;
|
|
}
|
|
return long.Parse(value);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public class Document
|
|
{
|
|
public String title;
|
|
public String filename;
|
|
public String realFilename;
|
|
public String content;
|
|
public int docId;
|
|
public String session;
|
|
public KnowledgeTreeService kt;
|
|
public long filesize;
|
|
public bool verbose;
|
|
public bool local;
|
|
|
|
public Document(int offset, String session, KnowledgeTreeService kt, bool verbose, bool local)
|
|
{
|
|
this.title = "kt unit test" + offset;
|
|
this.realFilename = "kt_unit_test" + offset + ".txt";
|
|
this.filename = (Helper.isUnix()?("/tmp/"):("c:\\")) + this.realFilename;
|
|
this.content = "Hello World!\nThis is a test! And more!\n\n\r\n";
|
|
this.docId = 0;
|
|
this.session = session;
|
|
this.kt = kt;
|
|
this.verbose =verbose;
|
|
this.local = local;
|
|
}
|
|
|
|
public kt_document_detail createFile(int folderId)
|
|
{
|
|
Helper.writeFile(this.filename, this.content);
|
|
this.filesize = this.content.Length;
|
|
|
|
if (this.local)
|
|
{
|
|
return null;
|
|
}
|
|
kt_document_detail d1 = this.kt.get_document_detail_by_title(this.session, folderId, this.title, "");
|
|
if (d1.status_code == 1)
|
|
{
|
|
this.docId = d1.document_id;
|
|
this.deleteFile();
|
|
}
|
|
|
|
kt_document_detail response1 = this.kt.add_base64_document(this.session, folderId, this.title, this.filename, "Default", Helper.ConvertFileToBase64Encoding(this.filename));
|
|
|
|
if (response1.status_code == 0)
|
|
{
|
|
this.docId = response1.document_id;
|
|
}
|
|
|
|
if (this.verbose)
|
|
{
|
|
if (response1.status_code == 0)
|
|
{
|
|
System.Console.WriteLine("docid: " + this.docId + " filename: " + this.filename);
|
|
}
|
|
else
|
|
{
|
|
System.Console.WriteLine("Could not create file: " + this.filename);
|
|
}
|
|
}
|
|
|
|
return response1;
|
|
|
|
}
|
|
|
|
public kt_document_detail createFileWithMetadata(int folderId, kt_metadata_fieldset[] metadata, kt_sysdata_item[] sysdata)
|
|
{
|
|
Helper.writeFile(this.filename, this.content);
|
|
|
|
this.filesize = this.content.Length;
|
|
|
|
if (this.local)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
kt_document_detail d1 = this.kt.get_document_detail_by_title(this.session, folderId, this.title, "");
|
|
if (d1.status_code == 1)
|
|
{
|
|
this.docId = d1.document_id;
|
|
this.deleteFile();
|
|
}
|
|
|
|
kt_document_detail response1 = this.kt.add_base64_document_with_metadata(this.session, folderId, this.title, this.filename, "Default", Helper.ConvertFileToBase64Encoding(this.filename), metadata, sysdata);
|
|
|
|
if (response1.status_code == 0)
|
|
{
|
|
this.docId = response1.document_id;
|
|
}
|
|
|
|
if (this.verbose)
|
|
{
|
|
if (response1.status_code == 0)
|
|
{
|
|
System.Console.WriteLine("docid: " + this.docId + " filename: " + this.filename);
|
|
}
|
|
else
|
|
{
|
|
System.Console.WriteLine("Could not create file: " + this.filename);
|
|
}
|
|
}
|
|
|
|
return response1;
|
|
}
|
|
|
|
public kt_document_detail checkinFileWithMetadata(int folderId, kt_metadata_fieldset[] metadata, kt_sysdata_item[] sysdata)
|
|
{
|
|
Helper.writeFile(this.filename, this.content);
|
|
this.filesize = this.content.Length;
|
|
|
|
if (this.local)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
kt_document_detail d1 = this.kt.get_document_detail_by_title(this.session, folderId, this.title, "");
|
|
if (d1.status_code == 1)
|
|
{
|
|
this.docId = d1.document_id;
|
|
this.deleteFile();
|
|
}
|
|
|
|
kt_document_detail response1 = this.kt.checkin_base64_document_with_metadata(this.session, this.docId, this.filename, "checkin reason", Helper.ConvertFileToBase64Encoding(this.filename), false, metadata, sysdata);
|
|
|
|
if (response1.status_code == 0)
|
|
{
|
|
this.docId = response1.document_id;
|
|
}
|
|
|
|
if (this.verbose)
|
|
{
|
|
if (response1.status_code == 0)
|
|
{
|
|
System.Console.WriteLine("docid: " + this.docId + " filename: " + this.filename);
|
|
}
|
|
else
|
|
{
|
|
System.Console.WriteLine("Could not create file: " + this.filename);
|
|
}
|
|
}
|
|
|
|
return response1;
|
|
}
|
|
|
|
|
|
|
|
public void deleteFile()
|
|
{
|
|
Helper.deleteFile(this.filename);
|
|
|
|
if (this.local)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (this.docId > 0)
|
|
{
|
|
|
|
kt_response response = this.kt.delete_document(this.session, this.docId, "Delete - cleaning up");
|
|
if (this.verbose && response.status_code != 0)
|
|
{
|
|
System.Console.WriteLine("Could not delete file: " + this.filename);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public class Helper
|
|
{
|
|
public static bool isUnix()
|
|
{
|
|
// found reference on: http://www.mono-project.com/FAQ:_Technical
|
|
int platform = (int) Environment.OSVersion.Platform;
|
|
return (platform == 4) || (platform == 128);
|
|
}
|
|
|
|
public static void writeFile(String filename, String text)
|
|
{
|
|
try
|
|
{
|
|
TextWriter tw = new StreamWriter(filename);
|
|
tw.WriteLine(text );
|
|
tw.Close();
|
|
}
|
|
catch (System.Exception exp)
|
|
{
|
|
System.Console.WriteLine("{0}", exp.Message);
|
|
throw;
|
|
}
|
|
}
|
|
|
|
public static String readFile(String filename)
|
|
{
|
|
String text = null;
|
|
try
|
|
{
|
|
FileStream inFile = new FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
|
|
StreamReader sr = new StreamReader(inFile);
|
|
text = sr.ReadToEnd();
|
|
inFile.Close();
|
|
}
|
|
catch (System.Exception exp)
|
|
{
|
|
System.Console.WriteLine("{0}", exp.Message);
|
|
throw;
|
|
}
|
|
|
|
return text;
|
|
}
|
|
|
|
public static void deleteFile(string filename)
|
|
{
|
|
try
|
|
{
|
|
File.Delete(filename);
|
|
}
|
|
catch(System.Exception)
|
|
{
|
|
// we are using this to cleanup, so don't handle
|
|
}
|
|
}
|
|
|
|
public static string ConvertFileToBase64Encoding(string filename)
|
|
{
|
|
System.IO.FileStream inFile;
|
|
|
|
byte[] binaryData;
|
|
string base64String = "";
|
|
|
|
try
|
|
{
|
|
inFile = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
|
|
binaryData = new Byte[inFile.Length];
|
|
inFile.Read(binaryData, 0, (int)inFile.Length);
|
|
inFile.Close();
|
|
|
|
base64String = System.Convert.ToBase64String(binaryData, 0, binaryData.Length);
|
|
}
|
|
catch (System.Exception exp)
|
|
{
|
|
System.Console.WriteLine("{0}", exp.Message);
|
|
throw;
|
|
}
|
|
|
|
return base64String;
|
|
}
|
|
|
|
public static long ConvertBase64EncodingToFile(String encoding, string filename)
|
|
{
|
|
System.IO.FileStream inFile;
|
|
|
|
byte[] binaryData;
|
|
|
|
try
|
|
{
|
|
binaryData = Convert.FromBase64String (encoding);
|
|
|
|
inFile = new System.IO.FileStream(filename, System.IO.FileMode.Create);
|
|
|
|
inFile.Write(binaryData, 0, (int)binaryData.Length);
|
|
inFile.Close();
|
|
}
|
|
catch (System.Exception exp)
|
|
{
|
|
System.Console.WriteLine("{0}", exp.Message);
|
|
throw;
|
|
}
|
|
return binaryData.Length;
|
|
}
|
|
|
|
}
|
|
}
|