diff Reservation.class.php @ 165:3d4df1fe4166

merged with upstream
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Thu, 08 Apr 2010 04:22:20 +0900
parents 66eabfc1b118 84220382fea8
children 1c4558d1a449
line wrap: on
line diff
--- a/Reservation.class.php	Fri Apr 02 20:40:55 2010 +0900
+++ b/Reservation.class.php	Thu Apr 08 04:22:20 2010 +0900
@@ -5,6 +5,11 @@
 include_once( INSTALL_PATH . "/Settings.class.php" );
 include_once( INSTALL_PATH . "/recLog.inc.php" );
 
+// 後方互換性
+if( !defined( "RECORDER_CMD" ) ) {
+	define( "RECORDER_CMD", INSTALL_PATH."/recorder.php" );
+}
+
 
 // 予約クラス
 
@@ -288,17 +293,13 @@
 			// ATで予約する
 			$process = proc_open( $cmdline , $descriptor, $pipes, INSTALL_PATH.$settings->spool, $env );
 			if( is_resource( $process ) ) {
-				fwrite($pipes[0], $settings->sleep." ".$sleep_time."\n" );
-				fwrite($pipes[0], DO_RECORD . "\n" );
-				fwrite($pipes[0], COMPLETE_CMD." ".$rrec->id."\n" );
-				if( $settings->use_thumbs == 1 ) {
-					fwrite($pipes[0], $gen_thumbnail."\n" );
-				}
+				fwrite($pipes[0], RECORDER_CMD." ".$rrec->id."\n" );
 				fclose($pipes[0]);
 				// 標準エラーを取る
-				$rstring = stream_get_contents( $pipes[2]);
+				$rstring = stream_get_contents($pipes[2]);
 				
 			    fclose( $pipes[2] );
+			    fclose( $pipes[1] );
 			    proc_close( $process );
 			}
 			else {
@@ -354,15 +355,57 @@
 				throw new Exception("IDの指定が無効です");
 			}
 			if( ! $rec->complete ) {
-				// 未実行の予約である
 				if( toTimestamp($rec->starttime) < (time() + PADDING_TIME + $settings->former_time) ) {
-					reclog("Reservation::cancel 未実行の予約の取り消しが実行された", EPGREC_ERROR );
-					throw new Exception("未実行の予約です");
+					reclog("Reservation::cancel 実行中の予約ID".$rec->id."の取り消しが実行された" );
+					
+					// recorderとの通信を試みる
+					$ipc_key = ftok( RECORDER_CMD, "R" );
+					
+					/* php 5.3以降じゃないとmsg_queue_existsは使えない
+					if( ! msg_queue_exists( $ipc_key ) ) {
+						// メッセージキューがない
+						reclog( "Reservation::cancel 実行中と推測される予約".$rec->id."が実行されていない", EPGREC_ERROR );
+						$rec->complete = 1;
+						throw new RecException( "Reserve:: 実行中と推測される予約が実行されていません。再度、削除を試みてください。", EPGREC_ERROR );
+					}
+					else {
+					*/
+						$msgh_r = msg_get_queue( $ipc_key );
+						$ipc_key = ftok( RECORDER_CMD, "W" );
+						$msgh_w = msg_get_queue( $ipc_key );
+						
+						// 終了を指示
+						msg_send( $msgh_r, (int)$rec->id, "terminate" );
+						sleep(1);
+						for( $i = 0; $i < 60; $i++ ) {
+							$r = msg_receive($msgh_w, (int)$rec->id , $msgtype, 1024, $message, TRUE, MSG_IPC_NOWAIT | MSG_NOERROR);
+							if( $r ) {
+								if( $message == "success" ) {
+									reclog( "Reserve:: 実行中の予約ID".$rec->id."の取り消しに成功した模様" );
+									break;
+								}
+								else if( $message == "error" ){
+									reclog( "Reserve:: 実行中の予約ID".$rec->id."の取り消しに失敗", EPGREC_ERROR );
+									throw new RecException("実行中の予約取り消しに失敗しました。しばらく時間をおいてから再度、取り消してください", EPGREC_ERROR );
+								}
+								// それ以外のメッセージは無視して待つ
+							}
+							sleep(1);
+						}
+						if( $i >= 60 ) throw new RecException("実行中の予約取り消しに失敗しました。しばらく時間をおいてから再度、取り消してください", EPGREC_ERROR );
+//					}
 				}
-				exec( $settings->atrm . " " . $rec->job );
-				reclog("Reservation::cancel ジョブ番号".$rec->job."を削除");
+				else {
+					// まだ実行されていない予約ならatを削除しとく
+					exec( $settings->atrm . " " . $rec->job );
+					reclog("Reservation::cancel ジョブ番号".$rec->job."を削除");
+					$rec->delete();
+				}
 			}
-			$rec->delete();
+			else {
+				// 録画済み予約ならただ消す
+				$rec->delete();
+			}
 		}
 		catch( Exception $e ) {
 			reclog("Reservation::cancel 予約キャンセルでDB接続またはアクセスに失敗した模様", EPGREC_ERROR );
@@ -370,4 +413,4 @@
 		}
 	}
 }
-?>
+?>
\ No newline at end of file