示例#1
0
 public CobaltHostLockingStore(CobaltSession session)
     : base()
 {
     m_session = session;
 }
示例#2
0
        private void ProcessRequest(IAsyncResult result)
        {
            try
            {
                Console.WriteLine("开始监听中...");
                HttpListener        listener = (HttpListener)result.AsyncState;
                HttpListenerContext context  = listener.EndGetContext(result);
                try
                {
                    //Console.WriteLine("1111...");
                    Console.WriteLine(context.Request.HttpMethod + @" " + context.Request.Url.AbsolutePath);
                    var stringarr    = context.Request.Url.AbsolutePath.Split('/');
                    var access_token = context.Request.QueryString["access_token"];

                    if (stringarr.Length < 3 || access_token == null)
                    {
                        Console.WriteLine(@"无效的请求");
                        ErrorResponse(context, @"无效的请求参数");
                        m_listener.BeginGetContext(ProcessRequest, m_listener);
                        return;
                    }

                    //todo:

                    documentUtil = new DocumentUtil();
                    //string fileId = stringarr[3];
                    var docInfo  = documentUtil.GetInfo(stringarr[3]);
                    var filename = docInfo.fileName;
                    //Stream gridfsStream = GetFileById(fileId);
                    //StreamToFile(gridfsStream, filename);


                    //use filename as session id just test, recommend use file id and lock id as session id
                    EditSession editSession = CobaltSessionManager.Instance.GetSession(filename);
                    if (editSession == null)
                    {
                        //Console.WriteLine("2222...");
                        var fileExt = filename.Substring(filename.LastIndexOf('.') + 1);
                        if (fileExt.ToLower().Contains("xlsx"))
                        {
                            editSession = new FileSession(filename, docInfo.filePath, docInfo.author, docInfo.author, docInfo.mail, false);
                        }
                        else
                        {
                            editSession = new CobaltSession(filename, docInfo.filePath, docInfo.author, docInfo.author, docInfo.mail, false);
                        }
                        CobaltSessionManager.Instance.AddSession(editSession);
                    }

                    if (stringarr.Length == 4 && context.Request.HttpMethod.Equals(@"GET"))
                    {
                        //Console.WriteLine("4444...");
                        //request of checkfileinfo, will be called first
                        var memoryStream = new MemoryStream();
                        var json         = new DataContractJsonSerializer(typeof(WopiCheckFileInfo));
                        json.WriteObject(memoryStream, editSession.GetCheckFileInfo());
                        memoryStream.Flush();
                        memoryStream.Position = 0;
                        StreamReader streamReader = new StreamReader(memoryStream);
                        var          jsonResponse = Encoding.UTF8.GetBytes(streamReader.ReadToEnd());

                        context.Response.ContentType     = @"application/json";
                        context.Response.ContentLength64 = jsonResponse.Length;
                        context.Response.OutputStream.Write(jsonResponse, 0, jsonResponse.Length);
                        context.Response.StatusCode = (int)HttpStatusCode.OK;
                        context.Response.Close();
                    }
                    else if (stringarr.Length == 5 && stringarr[4].Equals(@"contents"))
                    {
                        //Console.WriteLine("5555...");
                        // get and put file's content, only for xlsx and pptx
                        if (context.Request.HttpMethod.Equals(@"POST"))
                        {
                            var ms = new MemoryStream();
                            context.Request.InputStream.CopyTo(ms);
                            editSession.Save(ms.ToArray());
                            context.Response.ContentLength64 = 0;
                            context.Response.ContentType     = @"text/html";
                        }
                        else
                        {
                            var content = editSession.GetFileContent();
                            context.Response.ContentType     = @"application/octet-stream";
                            context.Response.ContentLength64 = content.Length;
                            context.Response.OutputStream.Write(content, 0, content.Length);
                        }
                        context.Response.StatusCode = (int)HttpStatusCode.OK;
                        context.Response.Close();
                    }
                    else if (context.Request.HttpMethod.Equals(@"POST") &&
                             context.Request.Headers["X-WOPI-Override"].Equals("COBALT"))
                    {
                        //Console.WriteLine("6666...");
                        //cobalt, for docx and pptx
                        var ms = new MemoryStream();
                        context.Request.InputStream.CopyTo(ms);
                        AtomFromByteArray atomRequest  = new AtomFromByteArray(ms.ToArray());
                        RequestBatch      requestBatch = new RequestBatch();

                        Object          ctx;
                        ProtocolVersion protocolVersion;

                        requestBatch.DeserializeInputFromProtocol(atomRequest, out ctx, out protocolVersion);
                        editSession.ExecuteRequestBatch(requestBatch);

                        foreach (Request request in requestBatch.Requests)
                        {
                            if (request.GetType() == typeof(PutChangesRequest) &&
                                request.PartitionId == FilePartitionId.Content)
                            {
                                editSession.Save();
                            }
                        }
                        var response = requestBatch.SerializeOutputToProtocol(protocolVersion);

                        context.Response.Headers.Add("X-WOPI-CorellationID", context.Request.Headers["X-WOPI-CorrelationID"]);
                        context.Response.Headers.Add("request-id", context.Request.Headers["X-WOPI-CorrelationID"]);
                        context.Response.ContentType     = @"application/octet-stream";
                        context.Response.ContentLength64 = response.Length;
                        context.Response.StatusCode      = (int)HttpStatusCode.OK;
                        response.CopyTo(context.Response.OutputStream);
                        context.Response.Close();
                    }
                    else if (context.Request.HttpMethod.Equals(@"POST") &&
                             (context.Request.Headers["X-WOPI-Override"].Equals("LOCK") ||
                              context.Request.Headers["X-WOPI-Override"].Equals("UNLOCK") ||
                              context.Request.Headers["X-WOPI-Override"].Equals("REFRESH_LOCK"))
                             )
                    {
                        //Console.WriteLine("7777...");
                        //lock, for xlsx and pptx
                        context.Response.ContentLength64 = 0;
                        context.Response.ContentType     = @"text/html";
                        context.Response.StatusCode      = (int)HttpStatusCode.OK;
                        context.Response.Close();
                    }
                    else
                    {
                        Console.WriteLine(@"无效的请求参数.");
                        ErrorResponse(context, @"无效的Word请求参数.");
                    }

                    Console.WriteLine("请求成功.");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(@"异常请求处理:" + ex.Message);
                }
                m_listener.BeginGetContext(ProcessRequest, m_listener);
            }
            catch (Exception ex)
            {
                Console.WriteLine(@"获取请求上下文异常:" + ex.Message);
                return;
            }
        }